簡體   English   中英

有效的C#:覆蓋Object.Equals(),不管是不是?

[英]Effective C#: Overriding Object.Equals(), yay or nay?

在第37頁的Effective C#第二版(ISBN-13:978-0321658708)中,該書內容如下

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

但是,在第39頁,這本書上寫着

關鍵是如果你的類型應該遵循值語義(比較內容)而不是引用語義(比較對象標識),你應該編寫自己的實例Object.Equals()覆蓋

有人會如此善意地解釋為什么會覆蓋

public virtual bool Equals(object right);

並不是

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

謝謝 :)

因為您無法覆蓋靜態方法。

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

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

不能被覆蓋。 靜態equals方法僅用於不進行空檢查。 在內部,它首先檢查引用等於然后內容等於(非靜態等於方法)。

在上面提到的引號中,第一個引用引用靜態equals方法,其中第二個引用非靜態equals方法,兩者都以符號形式寫為Object.Equals(),但注意第一個引用“static Object.Equals()”

永遠不會重新定義靜態 Object.Equals()

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

請注意區別, 靜態實例 這些句子不是指同一種方法......

另外,如果我沒有弄錯的話,靜態的只會比較參考,其中虛擬的那個使你能夠編寫自己的比較,大多數時候都是基於值而不是參考。

暫無
暫無

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

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