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中文网其他相关文章!