首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IEquatable <T>,IComparable <T>应该在非密封类上实现吗?

在这个问题中,我们要讨论的是在非密封类上实现IEquatable<T>和IComparable<T>接口的问题。这两个接口分别用于实现类型的相等性比较和比较功能。

首先,我们需要了解什么是密封类。密封类是一种特殊的类,它不能被继承。在C#中,通过在类声明前添加sealed关键字来创建密封类。密封类可以提高性能,因为它们不需要执行虚方法调用。

在非密封类上实现IEquatable<T>和IComparable<T>接口的决定取决于以下因素:

  1. 类的设计目的:如果类的设计目的是作为基类或者作为一个可以被继承的类,那么在非密封类上实现IEquatable<T>和IComparable<T>接口是合适的。这样,派生类可以重写这些接口的方法,以提供特定的实现。
  2. 类的使用场景:如果类的使用场景需要将其实例与其他实例进行比较或者排序,那么在非密封类上实现IEquatable<T>和IComparable<T>接口是合适的。这样可以提高代码的可读性和可维护性。
  3. 性能考虑:实现IEquatable<T>和IComparable<T>接口可能会带来一定的性能开销,因为这些接口方法可能需要进行虚方法调用。如果类的实例数量很大,并且性能是关键因素,那么在非密封类上实现这些接口可能不是最佳选择。

总之,在非密封类上实现IEquatable<T>和IComparable<T>接口取决于类的设计目的和使用场景。如果类的设计目的是为了继承,并且需要将其实例进行比较或排序,那么在非密封类上实现这些接口是合适的。但是,如果性能是关键因素,那么需要权衡实现这些接口带来的性能开销。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

从FCL的值类型实现寻找问题 有时候苦思冥想找不出问题,突然灵光一现,FCL中不也有一些自定义值类型? 比如 int,long,decimal,何不看它们是怎么实现的,寻找寻找灵感, 对吧。。。...public struct Int32 : IComparable, IFormattable, IConvertible, IComparable, IEquatable {...补上 IEquatable 接口 有了这个思路,我也跟FCL学,让Point实现 IEquatable接口,然后在TProxy代理中约束下必须实现IEquatable,修改代码如下:...因为这里的runtimeType实现IEquatable接口,所以代码返回了一个泛型比较器:GenericEqualityComparer,然后我们继续查看这个泛型比较器是咋样的。 ?...从图中可以看到最终还是对T进行了IEquatable约束,不过这里给提取出来了,还是挺厉害的,然后我也学的模仿一下: ? 可以看到也走了我的自定义实现,两种方式大家都可以用哈。

33320
  • C# - 实现类型的比较

    针对相等性而言,IEquatable仅仅就是对object里的那些Equals方法的补充。而针对比较性而言,IComparable是主打的方式。 其它的方式都有对应。...在自定义类型实现比较 其实我通常不在我的类型上去实现IComparable,包括引用类型和原始类型。...因为它没实现IComparable接口。 使用大于号小于号的话,也会报错: ? 因为这个类型也没有实现比较操作符。 实现IComparable接口 ?...=都实现了,那么其它的相等性判断方法也应该一同实现: object.Equals() object.GetHashCode() IEquatable 看起来挺麻烦,但这只是一个struct,还是相对简单的...但针对struct,其实还没完,还有一个泛型的IComparable接口,泛型出现之前,一直都是用这个接口的。

    1K20

    C#内建接口:IEquatable泛型

    像之前我们讲过的IComparable,IEnumerable接口,它们属于是1.0时期的内建接口,那时C#还没有泛型的概念,而2.0以后的版本,才有泛型的概念。...之所以出现泛型接口,是因为通过泛型可以减少值类型的装箱,以及实现类型安全。 IEquatable中有什么?...我们先看一下IEquatable泛型接口中的元素: 这个接口里边只有一个方法:Equals,返回一个Bool值,从名称中我们可以得知,这个接口规定了一个用于和其它类型作比较的规范,所有实现了这个接口的...,我们就可以调用其Equals方法来跟自己做比较,当前,前提是得跟泛型类型一致,下面我将通过一段代码来演示其用法: 有这样一个测试IEquatableTest,它有个Name属性,以及显示实现了...我们可以认为Object的Equals是IEquatable泛型版本方法,但是在实际应用过程中,我还是推荐大家显式实现IEquatable,有一个良好的代码规范,会让人舒心,关于显示实现接口相关介绍请查看

    54121

    了解C#的协变和逆变

    这些示例假定一个名为 Base 的基和一个名为 Derived的派生。 Covariance 使你能够使用比原始指定的类型派生程度更大的类型。...对于协变,有下面的约束,否则则会在编译时报错: 泛型参数占位符以out关键子标识,并且占位符T只能用于只读属性、方法或者委托的返回值,out简而易懂,就是输出的意思 当要进行类型转换,占位符T要转换的目标类型也必须是其基...,上述例子则是Foo隐式转为FooBase 逆变(Contravariance) 内置的泛型逆变委托Action、Func 、Predicate,内置的泛型逆变接口IComparableIEquatable...arg); public delegate bool Predicate(T obj); public interface IComparable {...other); } public interface IEquatable { bool Equals(T?

    93810

    利用 IComparableT> 以及 IComparer<T> 定义顺序关系

    那么你知道怎么样定义对象关系才是正确的?下面就听我一一道来。 零、讲解 在 .NET 中有两个接口可以用来定义关系,即 IComparable 和 IComparer 。...name) { this.name=name; } //实现 IComparable 中的 CompareTo 方法 public int CompareTo... 中的 CompareTo 方法 public int CompareTo(User user) => name.CompareTo(user.name); //实现 IComparable...难道我们要删掉 name 替换成 age ?当然不是,我们可以利用 Comparison形式的委托实现,这样我们就可以按照其他指标进行排列。...一、总结 在我们自定义类型的时候,IComparable 和 IComparer 是定义排序关系的标准,大部分排序基本都可以通过 IComparable实现,但是我们需要主义的时这个时候我们必须重载运算符

    56520

    深入.NET平台和C#编程

    、IList (3)我们习惯的说法是实现了一个接口、继承了一个 (4)实现一个接口的语法与继承类似:class Student:IComparable (5)如果类已经继承了一个父,则以","...分割父和接口 无序之分 (6)class Student:Person,IComparable 如果有父必须先继承父实现接口,实现接口无顺序之分哈!...(4)接口得使用方便团队开发协助 8-2:泛型接口 a.典型泛型接口IComparable的应用 例如: class Student:Person,IComparable...典型的应用就是接口作为参数时,我们要传递一个实现接口的 对象,另一个就是将接口作为返回值,实际要返回的也是实现了接口的对象。...c.接口和抽象 抽象与接口的区别 抽象 接口 用abstract定义 用interface定义 只能继承一个 可以实现多个接口 抽象派生必须实现抽象

    1.9K10

    C# 学习笔记(9)—— 泛型

    字面意思,泛型代表的就是 “通用类型”,它可以代替任意的数据类型,使类型参数化,从而达到只实现一个方法就可以操作多种数据类型的目的。泛型将方法实现行为与方法操作的数据类型分离,实现了代码重用。...public class Compare where T : Icomparable { public static T CompareGeneric(T t1, T t2) {...根据泛型类型参数是否提供实际类型,又可把泛型分为两: 未绑定的泛型:没有为类型参数提供实际类型 已构造的泛型:已指定了实际类型作为参数 已构造的泛型又可分为: 开放类型:包含类型参数的泛型 密封类型...这适用所有值类型,所有静态、抽象、没有显示声明构造函数的,以及显示声明了一个公共无参的构造函数的所有抽象 public class SampleValueType where T : class...基名(确保指定的类型实参必须是基或派生自基的子类) T : 接口名(确保指定的类型实参必须是接口或实现了该接口的T : U(确保提供的类型实参必须是 U 提供的类型实参或者是派生于 U 提供的类型实参

    17520

    泛型程序设计详解(一)

    还是复制修改?这样代码看上去很冗余,很复杂。这时候泛型就出现了。下面我们看下为何使用泛型吧。...优点   下面介绍下泛型的优点,尤其是下面几个: l 性能 l 类型安全 l 二进制代码重用   一、性能     泛型的一个主要优点就是性能,在泛型集合泛型集合中,对值类型使用泛型集合...二、类型安全     泛型另一个优点就是类型安全,这里我们还是使用泛型集合ArrayList()和泛型集合List来做案例。     ...派生自泛型类型T2,也就是说T1的参数类型要和T2一样)   public class Tclass where T:IComparable { }   三、继承     泛型类型的继承与普通的继承相似但不同.../ 继承抽象基实现int类型 /// /// class Tclass : Ttest

    59250

    Unity性能调优手册10C#优化:GC,对象池,forforeach,string,LINQ

    因此,可以为T指定不实现IEquatable接口的类型,并且存在通过隐式强制转换到Object类型来使用下面的Equals的情况。...```csharp public virtual bool Equals(object obj); 例如,如果struct没有实现IEquatable接口,却被指定为T,那么它将被强制转换为带有参数Equals...为了防止这种情况提前发生,请修改以下内容 public readonly struct GenericOnlyStruct : IEquatable where T : IEquatable...result; } } 通过使用where子句(泛型类型约束)将T可以接受的类型限制为那些实现IEquatable的类型,可以防止这种意外的装箱。...LINQ内部实例化一个实现Enumerable的,此外GetEnumerator()实现循环处理等造成了GC.Alloc LINQ延迟求值 LINQ方法(如Where和Select)是延迟计算

    1.3K11

    C#基础知识之base、this、new、override、abstract梳理

    一、Base关键词的几种用法 base重要用于OOP的多态,base 关键字用于在派生实现对基公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中 1、base调用基构造函数...当与其他约束一起使用时,new() 约束必须最后指定: public class Awhere T : IComparable, new() { //// } 四、override...关键字 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。...用abstract定义的不一定包含抽象方法,也可以包含抽象方法。 abstract定义的方法一定包含在抽象中。...抽象不能定义为密封(sealed),抽象方法不能使用virtual、static、private修饰符 如果派生没有实现所有的抽象方法,则该派生也必须声明为抽象

    44920

    C#中的泛型

    在.Net中,实现比较的基本方法是实现IComparable接口,它有泛型版本和泛型两个版本,因为我们现在正在讲解泛型,而可能你还没有领悟泛型,为了避免你的思维发生“死锁”,所以我们采用它的泛型版本...好了,我们现在回到正题,既然我们现在已经让Book实现IComparable接口,那么我们的泛型应该可以工作了吧?...我们需要告诉SortHelper(准确说是告诉编译器),它所接受的T类型参数必须能够进行比较,换言之,就是实现IComparable接口,这便是本小节的主题:泛型约束。...为了要求类型参数T必须实现IComparable接口,我们像下面这样重新定义SortHelper: public class SortHelper where T:IComparable {...为了解决这个问题,我们自然而然地会想到:有没有办法把类型参数T加到方法,而非整个,也就是降低T作用的范围。答案是可以的,这便是本小节的主题:泛型方法。

    1.2K70

    一文搞定泛型知识

    因此除非特殊情况,绝大多数情况下我们不应该在一个中多次实现同一个接口。...public class Demo where T:System.IComparable { //more code } 在上面这段代码中我们添加了 System.IComparable...约束,也就是说所提供的类型参数都必须实现 System.IComparable 接口。...那么当我们向 Demo 传递 StringBuilder 作为类型参数来创建 Demo 变量时编译器会报告一个错误,这是因为 StringBuilder 没有实现 IComparable 接口。...这里有一点需要注意如果同时指定了多种约束,那么类型约束必须位于第一位(第一个出现),并且泛型约束中是不允许使用多个类型约束的,这是因为我们的代码不可能从多个不想管的中派生出来,同样类型约束也不能指定密封或者不是的类型

    99910
    领券