什么时候应该重写在 'System' 命名空间中的 'Object' 类提供的 'GetHashCode()' 方法?
当你重写 Equals
时,基本上是想要提供与简单的引用相等性不同的相等性理念。
字符串是一个很好的例子 - 如果两个字符串表示相同的字符序列,则它们在简单调用Equals
时相等。哈希码反映了这一点,因此如果两个字符串相等,则它们将具有相同的哈希码。(反之则不一定成立 - 两个不相等的字符串可能会有相同的哈希码,但这种情况不太可能发生。)
(顺便说一句,字符串在其他方面也很棘手 - 基于文化和大小写,有许多不同的相等性理念,但是String.Equals
只查看组成字符串的UTF-16代码点,并以最简单的方式进行比较。)
如果您的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),则应编写自己的覆盖实例object.Equals()方法。
如果你重写 Equals
方法,那么你必须同时重写 GetHashCode
方法。
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx