我在 Essential C# 3.0 和 .NET 3.5 书中读到:
这是一个有效的指南吗?
我在 .NET 中尝试了几种内置类型,但它们的行为并不像这样。
最佳答案
答案主要是,它是一个有效的指南,但可能不是一个有效的规则。它也没有讲述整个故事。
重点是对于可变类型,您不能将哈希码基于可变数据,因为两个相等的对象必须返回相同的哈希码,并且哈希码必须在对象的生命周期内有效。如果散列码改变,你最终会得到一个对象,它会在散列集合中丢失,因为它不再存在于正确的散列箱中。
例如,对象 A 返回 1 的哈希值。因此,它进入哈希表的 bin 1。然后更改对象 A 使其返回 2 的哈希值。当哈希表查找它时,它会在 bin 2 中查找并找不到它 - 该对象在 bin 1 中是孤立的。这就是哈希码必须的原因在对象的生命周期内不会改变,这只是编写 GetHashCode 实现的一个原因。
更新
Eric Lippert has posted a blog 提供了关于 GetHashCode
的优秀信息。
附加更新
我在上面做了一些更改:
指南只是指南,而不是规则。实际上,
GetHashCode
只在期望对象遵循这些准则时才需要遵循这些准则,例如当它存储在哈希表中时。如果您从不打算在哈希表(或其他任何依赖于 GetHashCode
的规则)中使用您的对象,则您的实现不需要遵循这些准则。当您看到“对象的生命周期”时,您应该阅读“对象需要与哈希表合作的时间”或类似内容。像大多数事情一样,
GetHashCode
是关于知道何时打破规则。关于c# - C# 中的 GetHashCode 指南,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/462451/