[英]static Object.Equals method, default implementation of GetHashCode and the Dictionary class
[英]Strange implementation of Object.Equals
我正在閱讀有關object.Equals
的MSDN文檔 。 在評論部分提到:
如果兩個對象不表示相同的對象引用且都不為null,則它調用objA.Equals(objB)並返回結果。 這意味着如果objA重寫Object.Equals(Object)方法,則調用此覆蓋。
我的問題是為什么他們沒有將這個部分實現為objA.Equals(objB) && objB.Equals(objA)
以使等式對稱並且只關系到關系的一邊? 調用object.Equals
時可能會導致奇怪的行為。
編輯:當objA的類型覆蓋Equals
方法並將其實現為不可預測的東西時,可能會發生奇怪的行為,但objB的類型不會覆蓋Equals
。
基本上,這只對具有有缺陷的Equals
實現的開發人員有用。 從文檔 :
對於
Equals(Object)
方法的所有實現,以下語句必須為true。 在列表中,x
,y
和z
表示非空的對象引用。
- [...]
x.Equals(y)
返回與y.Equals(x)
相同的值。- [...]
因此,在正確實施該方法的每種情況下,檢查都是多余的 - 對每個做出正確事情的開發人員造成性能損失。
它對於沒有做正確事情的開發人員來說甚至不是非常有用,因為他們可能仍然期望object.Equals(x, y)
在返回true
時返回false
- 他們可以調試並發現他們的方法返回true,畢竟。 你可以說它會記錄下來檢查兩種方式 - 但是我們已經確定了影響的唯一開發人員是那些不讀文檔的人。
基本上,當您覆蓋方法或實現接口時,您應該知道您正在做什么並遵守指定的合同。 如果你不這樣做,你會得到奇怪的行為,我不認為期望每個調用者嘗試解決那些不符合他們意圖的實現是合理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.