2013-03-14 99 views
0

有問題的內部以下Guidelines for Overriding Equals() and Operator == (C# Programming Guide),重寫等於(object),以及等於(type)時,覆蓋gethashcode似乎是可取的。在覆蓋等於

在我的理解中,有關於重寫Equals的最佳實現的無盡討論。不過,我仍然希望理解Equals概念稍微好一些,併爲我自己決定。

問題可能會有點noobish,但在這裏我們去:

  • 等於(對象)和equals之間的主要區別是什麼(類型)(獨立給定參數)

據我瞭解(我可能是完全錯誤的,所以這是在同一時間的問題)

的equals(對象)是在方法構建看起來(如果對象 引用是相同的。和Equals(類型)是您創建的本地方法 。所以實際上,你在這門課上的是等於 與2重載。

  • 爲什麼他們檢查財產平等兩次?

的equals(對象)

return base.Equals(obj) && z == p.z; 

等於(型)

return base.Equals((TwoDPoint)p) && z == p.z; 
  • 爲什麼建議實施的Equals(類型) 方法?

  • 我的大部分問題都在我的問題1中發表。所以請注意任何錯誤或誤導性的理由。此外,隨時添加任何信息,它一定會有所幫助。

預先感謝

回答

2

首先讓區分2種方法

object.Equals()是在其上被標記爲virtualobject的方法,因此可以是在派生類重寫

IEquatable<T>.Equals是通過實現IEquatable<T>接口獲得的方法。

後者用於確定泛型集合內的等式;所以說,在文檔:

的IEquatable <牛逼>接口被泛型集合對象,如字典< TKEY的,TValue >,列表<牛逼>,和LinkedList <牛逼>對等方法,平等的測試時包含,IndexOf,LastIndexOf和Remove。它應該用於可能存儲在通用集合中的任何對象。

前者用於確定其他地方的平等。

因此,與到位的基礎讓我們試着來回答你的一些具體問題

等於(對象)和equals(型)之間的主要區別是什麼(獨立於給定參數的)?

一個在任何類型的工作,其他的比較同類型

爲什麼他們檢查財產平等兩次的情況?

他們不,通常只有一個被使用。然而,經常有一個實現在內部調用另一個實現

爲什麼建議實現Equals(type)方法?

答案是上面 - 如果你打算將對象存儲在一個泛型集合

作爲一個側面說明,以及一個可以幫助你理解這一點,平等檢查的默認行爲是檢查引用是相同的(即,一個對象與另一個對象是完全相同的實例)。經常使用不同的相等邏輯來比較對象字段中的某些數據(類似於z == p.z的示例)

+0

非常感謝您的先生。我不知道IEquatable 接口。所以我需要在我的類中實現這一點,以便能夠使用Equals(type)方法?這個標準是否實施?如果這沒有實現,那麼Equals(type)就變成了給定類中定製的方法?次要的,你說大部分時間,只有一個等於使用,如何確定等於?或者你的意思是程序員通常只實現了正確的等號(所以只有2箇中的一個)? – dylanmensaert 2013-03-14 13:07:29

+0

除非你的類實現了'IEquatable '沒有什麼會知道使用你的'Equals(Type)'方法 - 沒有必要添加這個方法。對不起,我不明白你的第二個問題。 – Jamiec 2013-03-14 13:10:54

+0

謝謝。那麼,爲了澄清我的第二個問題,你回答了我'爲什麼他們檢查支持平等不止一次':'他們不,通常只有一個被使用。如何確定哪一個等於方法(.Net是否確定這是智力?)被使用。或者你的意思是程序員只實現了正確的(所以eather equals(type)或equals(obj))方法。 (取決於當前類是否在列表中實現) – dylanmensaert 2013-03-14 13:18:50

0

重載之間的一個區別是,如上所述,比較對象時會調用一個到在編譯時已知的事物是相同的類型,而另一個將在所有其他情況下被調用。另一個沒有提到的重要區別是Equals(ownType)不僅會影響ownType的事物,還會影響可以隱式轉換爲ownType的事物。因此,不能期望Equals在可轉換類型的對象之間實現等價關係,除非強制其操作數是Object類型。例如,考慮

(12.0).Equals(12); 

將整數值12轉換爲Double值12.0。由於傳遞值的類型和值與調用Equals方法的12.0精確匹配,因此返回true

(12).Equals(12.0); 

因爲Double不是隱式轉換爲Int32,傳遞Double值作爲Object代替。由於Double與其調用Equals方法的12的類型不匹配,所以該方法返回false

虛擬方法Equals(Object)實現等價關係;在許多涉及隱式類型轉換的情況下,不能期望類型特定的方法這樣做。