有人可以用我可以理解的例子来解释.Equals、IComparable和IComparer之间的区别。
我在一次采访中被问到这个问题。
首先,从表面上看,Equals
是一种方法(存在于每个对象中),而IComparable
和IComparer
是接口。
Equals
存在于任何类中,并且可以被覆盖以根据类的上下文提供相等性测试(覆盖也是一个好习惯GetHashCode
)。默认情况下,它只是测试对象在内存中是否相等,这不是很有用。Equals
(and GetHashCode
) 通常在搜索或散列的上下文中被赋予不同的实现。
实现IComparable
是一种更细粒度的比较方式,因为它提供了CompareTo
一种大于/小于比较的方法,而不是Equals
简单的等于或不比较。例如,二叉搜索树结构可以从这种方法中受益。
IComparer
类似于IComparable
,除了它是从外部工作的。它允许您定义一个“中性”对象,用于比较其他两个对象而无需直接修改它们,您需要使用IComparable
.
Equals
是一种方法,当其他 2 个是接口时。所以看起来最大的不同。
更严重的是 - @ChrisSinclair 在评论中给了你答案......
如果两个对象相等(或相同的引用,取决于您的实现),Equals 返回 true/false IComparable/IComparer:IComparable 和 IComparer 之间的区别
.Equals() 为您的类提供了一种测试所有其他可能对象是否相等的方法。这可以被认为是对象相等的后备。所以这回答了我是否等同于作为参数传入的对象的问题。
IComparable 提供了一种比较可以排序的对象的方法,可能的用途包括排序。实现此接口会将排序逻辑放入您的类中。
IComparer 与 IComparable 几乎相同,只是逻辑包含在单独的类中。