我明白爲我的對象顯式實現Equals和GetHashCode。C#顯式平等運算符實現必要
但我不知道,如果它使任何意義,也明確落實==和=操作是這樣的:!
public static bool operator ==(Salutation left, Salutation right)
{
return Equals(left, right);
}
不C#不會自動使用Equals方法被調用時==?
我明白爲我的對象顯式實現Equals和GetHashCode。C#顯式平等運算符實現必要
但我不知道,如果它使任何意義,也明確落實==和=操作是這樣的:!
public static bool operator ==(Salutation left, Salutation right)
{
return Equals(left, right);
}
不C#不會自動使用Equals方法被調用時==?
確實有意義,覆蓋相等運算符以及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的。
默認情況下,值類型不會爲==提供過載 。但是,大多數 框架提供的值類型都提供它們自己的過載。 一個值類型等於 的默認實現由 值類型提供,並使用反射來使 比較,這使得它 比 類型特定的實施顯著較慢通常 會。這個實現也調用 在兩個值內的參考對之間進行比較。
如果你不重載它,==只是檢查引用相等:雙方是否指向同一個對象?
如果您需要值相等(兩側的不同對象具有相同的值?),則可以重載操作符。在這一點上,你幾乎總是希望重載.Equals()和.GetHashCode()以及讓你的==重載調用.Equals()。
謝謝。我接受了你的回答,但是你能否在Joel所說的一些事情上編輯? ==如果沒有被覆蓋,它的行爲如何。 – Tigraine 2009-10-02 21:30:29
@Tigraine:沒問題。事實上Joel所說的(以及更多)是在Jon Skeet所寫的頁面中提到的。如果你喜歡,我會引用。 – Noldorin 2009-10-02 21:40:21
謝謝.. :) 這只是更容易閱讀這種方式;) – Tigraine 2009-10-03 19:02:23