2011-05-10 41 views
4

在有效的C#第二版(ISBN-13:978-0321658708)第37頁,書曰Effective C#:Overriding Object.Equals(),yay or nay?

你永遠不會重新定義的第二個功能是靜態的Object.Equals()

然而,第39頁,書曰

的一點是,如果你的類型應該遵循值語義(比較內容),而不是參考語義(COMPAR荷蘭國際集團的對象的身份),你應該寫你自己的實例的Object.Equals()

會有人這麼好心的覆蓋來解釋爲什麼一個會覆蓋

public virtual bool Equals(object right); 

,而不是

public static bool Equals(object left, object right); 

謝謝:)

回答

8

因爲你不能覆蓋靜態方法。

+0

那麼,這肯定是一個有效的理由。謝謝! – 2011-05-10 15:25:58

1

從來不會重新定義靜態的Object.Equals()

你應該寫自己的實例的Object.Equals()

發現其中的差別,靜態 VS 覆蓋實例。這些句子不是指相同的方法...

1

另外,如果我沒有弄錯,靜態的只會比較參考,在虛擬的那個給你能力寫你自己的比較,其中大部分時間是基於價值而不是參考。

2

要清除的第一件事是你不能覆蓋靜態方法。執行

public static bool Equals(object left, object right); 

不能被覆蓋。靜態等值方法只是爲了不做空值檢查而保持一致。它在內部首先檢查引用等於然後內容等於(非靜態等於方法)。

在上面提到的引號中,第一個引用指的是static equals方法,其中第二個引用非靜態equals方法都以Object.Equals()的形式寫成表達式,但注意第一個表示「static Object.Equals ()「

+0

說一個非靜態方法是一個實例方法是否正確? – 2011-05-10 15:27:22

+2

是的,「非靜態」==「實例」 – 2011-05-10 15:44:50

+0

要回答我自己的問題:[是](http://msdn.microsoft.com/en-us/library/aa645766(v = vs.71).aspx ) – 2011-05-10 15:45:15