是的,将您的项目用作字典或
HashSet<T>等等中的键非常重要-
因为它用于(在没有custom的情况下
IEqualityComparer<T>)将项目分组到存储桶中。如果两个项目的哈希码不匹配,则可能 永远不会
认为它们相等(永远不会调用等于)。
所述的GetHashCode()方法应该反映
Equals逻辑;
规则是:
- 如果两个事物相等(
Equals(...) == true
),则它们 必须 返回相同的值GetHashCode()
- 如果
GetHashCode()
是相等的,它是 不 必要对他们是相同的; 这是一次碰撞,Equals
将调用它来查看它是否是真正的相等性。
在这种情况下,看起来“
returnFooId;”是合适的
GetHashCode()实现。如果您要测试多个属性,通常使用如下代码将它们组合在一起,以减少对角线冲突(即,
newFoo(3,5)与的哈希码不同
new Foo(5,3)):
unchecked // only needed if you're compiling with arithmetic checks enabled{ // (the default compiler behaviour is *disabled*, so most folks won't need this) int hash = 13; hash = (hash * 7) + field1.GetHashCode(); hash = (hash * 7) + field2.GetHashCode(); ... return hash;}
哦,为方便起见,在覆盖和时,您也可以考虑提供
==和
!=运算符。
Equals``GetHashCode
当你得到这个错误会发生什么情况的演示是在这里。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)