首页 > 后端开发 > C++ > 为什么在覆盖`equals'时必须覆盖``gethashcode''?

为什么在覆盖`equals'时必须覆盖``gethashcode''?

Linda Hamilton
发布: 2025-02-02 15:16:10
原创
344 人浏览过

Why Must You Override `GetHashCode` When Overriding `Equals`?

覆盖GetHashCodeEquals用于一致的对象比较

> 当您重新定义类的对象如何通过覆盖

>方法比较类的对象时,也必须覆盖Equals>方法。当您的对象用作基于哈希的集合(例如词典或哈希集)中的键时,这一点尤其重要。GetHashCode

考虑一个类

Foo>

<code class="language-csharp">public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}</code>
登录后复制
>如果您自定义基于

属性的对象进行自定义,则默认Equals(从Foo继承)仍将基于对象的内存地址生成哈希码。 当将FooId对象用作哈希表中的键时,这种不一致会导致不可预测的行为。GetHashCode Object>Foo为什么一致的哈希重要

覆盖至关重要:

>

GetHashCode

一致的散列:
    >对象的哈希代码确定其在哈希表中的位置。 均等对象
  • 必须具有相同的哈希代码,以确保它们始终放置在同一桶中。 避免使用哈希碰撞:如果两个对象具有相同的哈希代码(碰撞),则基于哈希的集合可能会错误地假设它们是相同的,而无需调用
  • 验证。 良好的>最小化碰撞,确保用于确定真正的平等。 Equals GetHashCodeEquals>实现

GetHashCode实现应与方法的逻辑一致:

GetHashCode均等对象必须具有相同的哈希代码。Equals>

>相同的哈希代码不能保证平等,但是它们触发了
    的方法进行确定的比较。
  • Equals
  • 类,合适的
覆盖为:

Foo这将基于GetHashCode>生成哈希码,镜像

中的等价检查
<code class="language-csharp">public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}</code>
登录后复制

使用自定义比较来增强清晰度FooIdEquals>

覆盖

时,请考虑添加自定义平等运算符(

)以提高代码可读性和可维护性。

以上是为什么在覆盖`equals'时必须覆盖``gethashcode''?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板