何时重写GetHashCode()?

时间:2009-04-09 05:28:54

标签: c# .net

我们何时应该覆盖“系统”命名空间中“对象”类提供的 GetHashCode ()方法?

4 个答案:

答案 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