2009-10-02 21 views
7

我明白爲我的對象顯式實現Equals和GetHashCode。C#顯式平等運算符實現必要

但我不知道,如果它使任何意義,也明確落實==和=操作是這樣的:!

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

不C#不會自動使用Equals方法被調用時==?

回答

8

確實有意義,覆蓋相等運算符以及Equals。這實際上是非常明智的。

微軟在MSDN上發佈了官方Guidelines for Implementing Equals and the Equality Operator (==)。我肯定會按照推薦的做法去那裏。這兩個要點是:

  • 實現無論何時實施的Equals 方法GetHashCode方法。這將保持Equals和 GetHashCode同步。
  • 每當您實現相等運算符 (==)時重寫Equals方法,並使它們執行相同的操作。 這使基礎設施代碼(如 )成爲Hashtable和ArrayList,使用Equals方法的 與使用 等號運算符編寫的用戶代碼具有相同的行爲方式 。

喬恩斯基特也寫了useful MSDN blog post這個話題,總結如何Equals,默認情況下對參考/值類型==操作員的工作量。

最重要的部分引用如下:

equals方法只是一個虛擬 一個在System.Object的定義,並通過 爲準類選擇 重寫這樣做。 ==運算符是一個 運算符,它可以通過 類過載,但通常具有 標識行爲。

對於在==沒有 被重載引用類型,比較 兩個引用是否指向同一個對象 - 這也正是 實施的Equals的確實在 System.Object的。

默認情況下,值類型不會爲==提供過載 。但是,大多數 框架提供的值類型都提供它們自己的過載。 一個值類型等於 的默認實現由 值類型提供,並使用反射來使 比較,這使得它 比 類型特定的實施顯著較慢通常 會。這個實現也調用 在兩個值內的參考對之間進行比較。

+0

謝謝。我接受了你的回答,但是你能否在Joel所說的一些事情上編輯? ==如果沒有被覆蓋,它的行爲如何。 – Tigraine 2009-10-02 21:30:29

+0

@Tigraine:沒問題。事實上Joel所說的(以及更多)是在Jon Skeet所寫的頁面中提到的。如果你喜歡,我會引用。 – Noldorin 2009-10-02 21:40:21

+0

謝謝.. :) 這只是更容易閱讀這種方式;) – Tigraine 2009-10-03 19:02:23

2

如果你不重載它,==只是檢查引用相等:雙方是否指向同一個對象?

如果您需要值相等(兩側的不同對象具有相同的值?),則可以重載操作符。在這一點上,你幾乎總是希望重載.Equals()和.GetHashCode()以及讓你的==重載調用.Equals()。