首頁 >後端開發 >C++ >如何在C#中保持一致的對象平等和哈希?

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

Barbara Streisand
Barbara Streisand原創
2025-02-02 15:21:10237瀏覽

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