何时重写GetHashCode()?

我们什么时候应该覆盖’ System ‘命名空间中’ Object ‘类提供的GetHashCode ()方法?

当你重写Equals ,基本上。 当你想提供不同的平等概念而不是简单的引用平等。

String就是一个很好的例子 – 如果它们代表相同的字符序列,则两个字符串相等(在简单的Equals调用下)。 哈希码反映了这一点,这样如果两个字符串相等,它们将具有相同的哈希码。 (反过来不一定正确 – 两个不相等的字符串可以具有相同的哈希码,但它不太可能。)

(字符串在其他方面很棘手,请注意 – 基于文化和套管有很多不同的平等概念,但String.Equals只是查看构成字符串的UTF-16代码点,并在最简单的情况下对它们进行比较可以想象的时尚。)

如果你的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),你应该编写自己的实例对象覆盖.Equals()。

如果重写Equals ,则必须覆盖GetHashCode

“GetHashCode方法可以被派生类型覆盖。值类型必须覆盖此方法,以提供适合该类型的哈希函数,并在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于关于实例字段或属性的值而不是静态字段或属性。

用作Hashtable对象中的键的对象还必须覆盖GetHashCode方法,因为这些对象必须生成自己的哈希代码。 如果用作键的对象不提供GetHashCode的有用实现,则可以在构造Hashtable对象时指定哈希代码提供程序。 在.NET Framework 2.0版之前,哈希代码提供程序基于System.Collections .. ::。IHashCodeProvider接口。 从2.0版开始,哈希码提供程序基于System.Collections .. ::。IEqualityComparer接口。“

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx