跳到主要内容

C#两个对像值相同(x.equals(y)== true),但却可有不同的hashcode,这句话对不对?

参考答案:

这句话不对。在C#中,如果两个对象通过Equals方法比较相等(即x.Equals(y) == true),那么它们的GetHashCode方法必须返回相同的哈希码值。这是哈希码和相等性在.NET框架中的契约要求。

具体来说,Object类中的GetHashCode方法规定:

  • 如果两个对象根据Equals(Object)方法是相等的,那么调用这两个对象的GetHashCode方法必须产生相同的整数结果。
  • 如果两个对象根据Equals(Object)方法不相等,那么调用这两个对象的GetHashCode方法不一定产生不同的整数结果,但产生不同整数结果可以提高哈希表的性能。

这意味着,如果你重写了Equals方法,你也应该重写GetHashCode方法,以确保这两个方法的行为是一致的。如果你不重写GetHashCode方法,而只是依赖于Object类的默认实现,那么即使两个对象在逻辑上是相等的,它们的哈希码也可能不同,这通常会导致在使用哈希表(如Dictionary<TKey, TValue>HashSet<T>)时出现不正确的行为。

因此,正确的做法是,如果两个对象相等,它们的哈希码也必须相同。这是确保哈希表等数据结构能够正确工作的关键。