簡體   English   中英

在C#中為類實現==運算符的最佳實踐是什么?

[英]What are the best practices for implementing the == operator for a class in C#?

在實現一個==運算符時,我覺得我缺少一些基本要點。
因此,我正在尋找一些最佳實踐。
以下是我正在考慮的一些相關問題:

  • 如何干凈地處理參考比較?
  • 它應該通過IEquatable<T>類接口實現嗎? 或者重寫object.Equals
  • 那么!=運算符呢?

(此列表可能並非詳盡無遺)。

我會遵循Microsoft的重載等於()和運算符==指南

編輯 :微軟的指南包含這個重要的評論,這似乎證實了Henk的答案:

默認情況下,operator ==通過確定兩個引用是否指示相同的對象來測試引用相等性,因此引用類型不需要實現operator ==以獲得此功能。 當一個類型是不可變的,意味着實例中包含的數據不能被改變時,重載operator ==來比較值相等而不是引用相等可能是有用的,因為作為不可變對象,只要它們具有它們就可以被認為是相同的相同的價值。 不建議在非不可變類型中覆蓋operator ==

每次實現==運算符時,一定要實現!=IEquatable<T>並覆蓋Object.Equals()Object.GetHashCode()以保證類的用戶的一致性。

考慮到一個類,這是我通常的實現:

    public bool Equals(MyClass other) {
        if (ReferenceEquals(other, null))
            return false;
        if (ReferenceEquals(other, this))
            return true;
        return // your equality code here
    }

    public override bool Equals(object obj) {
        return Equals(obj as MyClass);
    }

    public override int GetHashCode() {
        return // your hash function here
    }

    public static bool operator ==(MyClass left, MyClass right) {
        return Equals(left, right);
    }

    public static bool operator !=(MyClass left, MyClass right) {
        return !(left == right);
    }
  • 如果你實現==,覆蓋.Equals和。 GetHashCode的
  • 實施!=同樣
  • 使用object.ReferenceEquals檢查空引用,否則運算符將遞歸

最常見的方法是處理它。 默認值是引用比較,通常適用於類對象。

所以首先你要確定你需要價值型行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM