首頁 >後端開發 >C++ >如何最好地比較 .NET 中的參考類型?

如何最好地比較 .NET 中的參考類型?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-07 17:51:40250瀏覽

How to Best Compare Reference Types in .NET?

.NET 引用類型比較的最佳實踐

在 .NET 中比較引用類型時,請務必理解引用相等和值相等之間的差異。引用相等檢查兩個引用是否指向同一對象,而值相等檢查對像是否具有相同的資料。

重寫相等運算子 (==) 和 Equals 方法

除非型別表示值語意(即,基於其資料視為相等的不可變物件),否則不建議重寫相等運算子 (==) 和/或 Equals 方法來比較參考型別。在這種情況下,請考慮實作 System.IEquatable 介面以及三個運算子:Equals、GetHashCode 和 ==/!=。

IEquatable 介面

如果您的引用類型表示值語義,則實作 System.IEquatable。這確保了值相等的正確和高效實現,包括分別處理物件標識和值相等。

IComparable 介面

IComparable 主要設計用於值類型,而不是引用類型。避免將其用於引用類型。

自訂比較

與其重寫相等運算子或實作 IComparable,不如考慮建立一個自訂方法來比較參考類型。使用 Equals 方法檢查物件標識並重寫它以比較相關的屬性。

值相等的範例

以下是為 Point 類別實作值相等的範例:

<code class="language-csharp">class Point : IEquatable<Point>
{
    public int X { get; }
    public int Y { get; }

    public Point(int x = 0, int y = 0) { X = x; Y = y; }

    public bool Equals(Point other)
    {
        if (other is null) return false;
        return X.Equals(other.X) && Y.Equals(other.Y);
    }

    public override bool Equals(object obj) => Equals(obj as Point);

    public static bool operator ==(Point lhs, Point rhs) => object.Equals(lhs, rhs);

    public static bool operator !=(Point lhs, Point rhs) => !(lhs == rhs);

    public override int GetHashCode() => HashCode.Combine(X, Y);
}</code>

結論

對於具有值語意的參考類型,請實作 System.IEquatable 和所有三個相等運算子 (Equals、GetHashCode、==/!=)。對於表示可變值的引用類,請不要重寫 ==/!= 運算子。使用它們的預設行為來檢查物件標識。

以上是如何最好地比較 .NET 中的參考類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn