-1

有人可以用我可以理解的例子来解释.Equals、IComparable和IComparer之间的区别。

我在一次采访中被问到这个问题。

4

3 回答 3

8

首先,从表面上看,Equals是一种方法(存在于每个对象中),而IComparableIComparer是接口。

Equals存在于任何类中,并且可以被覆盖以根据类的上下文提供相等性测试(覆盖也是一个好习惯GetHashCode)。默认情况下,它只是测试对象在内存中是否相等,这不是很有用。Equals(and GetHashCode) 通常在搜索或散列的上下文中被赋予不同的实现。

实现IComparable是一种更细粒度的比较方式,因为它提供了CompareTo一种大于/小于比较的方法,而不是Equals简单的等于或不比较。例如,二叉搜索树结构可以从这种方法中受益。

IComparer类似于IComparable,除了它是从外部工作的。它允许您定义一个“中性”对象,用于比较其他两个对象而无需直接修改它们,您需要使用IComparable.

于 2012-06-25T16:18:40.763 回答
0

Equals是一种方法,当其他 2 个是接口时。所以看起来最大的不同。

更严重的是 - @ChrisSinclair 在评论中给了你答案......

如果两个对象相等(或相同的引用,取决于您的实现),Equals 返回 true/false IComparable/IComparer:IComparable 和 IComparer 之间的区别

于 2012-06-25T16:19:03.903 回答
0

.Equals() 为您的类提供了一种测试所有其他可能对象是否相等的方法。这可以被认为是对象相等的后备。所以这回答了我是否等同于作为参数传入的对象的问题。

IComparable 提供了一种比较可以排序的对象的方法,可能的用途包括排序。实现此接口会将排序逻辑放入您的类中。

IComparer 与 IComparable 几乎相同,只是逻辑包含在单独的类中。

于 2012-06-25T16:23:08.680 回答