CompareTo()方法是否使用GetHashCode()?

时间:2014-05-26 07:25:40

标签: c# hashcode compareto

方法CompareTo()是否使用GetHashCode()为对象定义了一个可比较的(不是接口)数字?如果我做

MyObject.CompareTo(MyOtherObject.GetHashCode())

如果我不想覆盖CompareTo()方法会怎样?

1 个答案:

答案 0 :(得分:3)

不,CompareTo不会/不应该使用GetHashCode来检查是否相等。

他们可能(强调可能)使用它来确定不等式,如果哈希码被缓存,因此比查看比所有内部数据更便宜,但是相等的哈希码并不一定意味着相等的对象。

如果你实现了Equals和GetHashCode(你需要实现两者或没有),那么你应该遵循以下规则:

  1. 如果两个对象相等(Equals返回true),它们应该从GetHashCode生成相同的哈希码。您可以将此规则置于其头,并说如果两个GetHashCode方法返回不同的值,则Equals应返回false。
  2. 请注意,相反的情况并不成立。如果Equals返回false,则GetHashCode返回相同的值是完全有效的,尽管通常不太可能。同样,如果GetHashCode返回相同的值,则完全有效,但通常非常不可能,Equals返回false。这是因为Pigeonhole Principle (wikipedia link)
  3. 始终使用相同的字段来检查相等性并计算哈希码
  4. 不要使用可变字段(如果可以帮助的话)。如果这样做,请明确哪些字段会破坏哈希码和相等性检查。在hashset或字典中填充可变对象并修改它们将破坏所有内容。

  5. 如果这是你自己创造的一个对象,那么这里有一些规则:

    1. 如果您需要订购支持,请实施CompareTo和IComparable<T>。不要仅使用CompareTo 来获得相等检查。
    2. 如果需要进行相等检查,请实施Equals,GetHashCode和IEquatable<T>
    3. 如果它是您无法修改的对象,请创建:

      1. IComparer<T>支持订购
      2. IEqualityComparer<T>支持平等检查
      3. 大多数将进行排序或相等检查的集合或方法允许您指定一个额外的对象,该对象确定排序或相等检查的规则,假设对象内置的实现是错误的(可能只在这一个场景中) )或遗失。

        指向所有类型的链接: