我们何时应该覆盖“系统”命名空间中“对象”类提供的 GetHashCode ()方法?
答案 0 :(得分:14)
基本上覆盖Equals
时。当你想提供一个不同的平等概念而不是简单的引用相等。
String就是一个很好的例子 - 如果它们代表相同的字符序列,则两个字符串相等(在简单的Equals调用下)。哈希码反映了这一点,这样如果两个字符串相等,它们将具有相同的哈希码。 (反过来不一定正确 - 两个不相等的字符串可以具有相同的哈希码,但不太可能。)
(字符串在其他方面很棘手,请注意 - 基于文化和套管有很多不同的平等概念,但String.Equals
只是查看构成字符串的UTF-16代码点,以及以最简单的方式比较它们。)
答案 1 :(得分:4)
如果你的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),你应该编写自己的实例对象覆盖.Equals()。
答案 2 :(得分:3)
如果您覆盖Equals
,则必须覆盖GetHashCode
。
答案 3 :(得分:1)
“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