当覆盖Equals方法时,覆盖GetHashCode为什么很重要?

当覆盖Equals方法时,覆盖GetHashCode为什么很重要?,第1张

覆盖Equals方法时,覆盖GetHashCode为什么很重要?

是的,将您的项目用作字典或

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


当你得到这个错误会发生什么情况的演示是在这里。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5011869.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存