首页 >后端开发 >C++ >如何在C#中保持一致的对象平等和哈希?

如何在C#中保持一致的对象平等和哈希?

Barbara Streisand
Barbara Streisand原创
2025-02-02 15:21:10289浏览

How to Maintain Consistent Object Equality and Hashing in C#?

C# 中对象相等性和哈希值的一致性维护

在 Foo 类中重写 Equals 方法以比较 FooId 属性,确保对象相等性的一致性。但是,重写 GetHashCode 方法同样至关重要,以遵守这两个方法的规则。

重写 GetHashCode 的重要性

当对象用作字典或哈希集等数据结构中的键时,GetHashCode 用于确定应将对象放置在哪个桶中。如果应该视为相等(由 Equals 定义)的两个对象的哈希码不同,则它们可能永远不会被比较,导致相等性评估不正确。

GetHashCode 的推荐实现

在这种情况下,GetHashCode 的推荐实现是:

<code class="language-csharp">public override int GetHashCode() => base.GetHashCode();</code>

这与 Equals 方法建立的逻辑等价性一致,断言基于 FooId 的相等性意味着所有哈希码目的的相等性。

高级考虑

对于在相等性比较中涉及多个属性的更复杂的对象,请考虑在现代框架中使用 HashCode 类型或实现自定义哈希码计算:

<code class="language-csharp">public override int GetHashCode()
{
    unchecked
    {
        int hash = 13;
        hash = (hash * 7) + FooId.GetHashCode();
        hash = (hash * 7) + FooName.GetHashCode();
        return hash;
    }
}</code>

附加便利

为了方便起见,可以考虑实现 == 和 != 运算符以补充重写的 Equals 和 GetHashCode 方法:

<code class="language-csharp">public static bool operator ==(Foo left, Foo right) => left.Equals(right);
public static bool operator !=(Foo left, Foo right) => !left.Equals(right);</code>

通过遵守这些原则,可以确保相等性和哈希的一致行为,从而提高应用程序的可靠性和性能。

以上是如何在C#中保持一致的对象平等和哈希?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn