2009-10-06 75 views
6

在執行==操作員時,我感覺我缺少一些要點。
因此,我正在尋找一些最佳做法。
下面是我想到的一些相關問題:在C#中爲一個類實現==操作符的最佳實踐是什麼?

  • 如何幹淨地處理所述基準比較?
  • 是否應該通過IEquatable<T>類接口來實現?或者覆蓋object.Equals
  • 那麼運營商!=呢?

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

+3

檢查這些線程:http://stackoverflow.com/questions/962960/equals-method-implementation-helpers-c,http://stackoverflow.com/questions/1421289/icomparable-and-equals,http:/ /stackoverflow.com/questions/660566/override-equals-and-gethashcode-question,http://stackoverflow.com/questions/567642/how-to-best-implement-equals-for-custom-types – Groo 2009-10-06 11:16:27

回答

3
  • 如果你實現==,覆蓋.Equals和。 GetHashCode的
  • 實現!=以及
  • 檢查使用object.ReferenceEquals空引用,否則運營商將遞歸
+2

其實,你還要實現!=,否則C#不會讓你編譯。 – 2009-10-06 11:21:15

+0

好點。忘記了。 – dkackman 2009-10-06 11:45:53

4

每次執行==經營者,一定要還實現!=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); 
    } 
+0

這個。而且,如果您最初實現<(小於)運算符,則可以單獨使用該運算符來實現每個其他運算符。即:如果已經實現<運算符,==可以表示爲!(左<右||右<左)。 – 2009-10-06 12:33:57

4

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

所以首先你要非常確定你需要價值型行爲。

+2

讓我們明確回答問題,而不是告訴某人改變他們做事的建議。 – 2009-10-06 11:22:38

0

對於這樣的任務使用Resharper。重新發明車輪毫無意義。

+1

對於這樣一項微不足道的任務來說,這是一個昂貴的解決方案 – spender 2009-10-06 11:51:31

+1

此外,對於某些任務,比如這樣,我寧願讓開發人員*學會如何正確地做某些事情,而不是讓一些工具爲他工作,再想一想。 – 2009-10-06 13:23:33

+0

@spender我相信你知道R#不僅可以用於這樣簡單的任務。 @Mike他們應該能夠親手寫這篇文章,但他們也應該有更高效的工具,而不必寫出來。 – 2009-10-06 14:09:51