2015-11-13 42 views
1

讓我們考慮Polygon類。大多數情況下,檢查平等是否應該比較參考值,但是在許多情況下,值相等會派上用場(例如,將兩個多邊形與Assert.AreEqual進行比較)。應該==運算符與Equals()完全相同嗎?

我的想法是使參考平等的價值平等略爲次要。在這種情況下,很明顯==operator應該保持其默認引用檢查實現。

那麼object.Equals()IEquatable<Polygon>.Equals()呢? MSDN並不意味着==.Equals()應該這樣做,但仍然 - 它不會使Polygon對象的行爲過於模糊嗎?

此外,Polygon類是可變的。

+0

他們是不一樣的.'長期短''.Equals用於對象相等''==用於檢查值的相等'做一個谷歌搜索更深入的澄清。爲什麼人們在這裏問問題,他們可以很容易地找到答案買一個簡單的谷歌搜索'我只是好奇' – MethodMan

+0

我不會在這裏問這個問題的OP錯誤。我發現,與谷歌搜索相比,搜索引擎是獲得知情答案的更有聲譽的來源。而且,正如他所說,MSDN並不總是清楚這些事情。 –

+0

@MikeHofer問題不在於*上的主題*。 – Servy

回答

2

MSDN幾乎是明確它

要檢查引用相等,使用ReferenceEquals要檢查價值相等的 ,您通常應該使用Equals。然而,等於 由Object執行只是執行參考身份檢查。因此, 因此很重要,當您撥打Equals時,請驗證 類型是否覆蓋它以提供值相等語義。當您創建自己的類型 時,應該覆蓋Equals


默認情況下,運營商==測試參考平等通過 確定兩個引用是否表示相同的對象,所以引用 類型並不需要實現順序==操作符以獲得此功能 功能。 當類型是不可變的,這意味着包含在 實例中的數據不能被改變,重載運算符==比較 值相等,而不是參考平等可以是有用的因爲,如 不可變的對象,它們可以被認爲是隻要它們的 具有相同的值。 非可變類型的覆蓋運算符==是 不建議

IEquatable文檔也很清楚

定義值類型或類實現來 創建用於確定實例平等類型特定的方法的一般化方法。

+0

我不想重寫'=='。我問的是,在可變類中是否重寫'.Equals()'(使其通過值進行比較)不會引入歧義。考慮到價值平等檢查在意識形態上是參考檢查的「次要」。 –

1

平等的測試在.NET(以及JAVA)的主要困難是,有兩個有用的等價關係,各自基於可合理要求的任意類對象的問題,但。NET對於EqualsGetHashCode應該回答哪個問題或關係應該進行封裝並不一致。這些問題是:

  1. 你會永遠,永遠等同於一些特定的引用標識的對象,無論發生什麼事情給你。

  2. 您會認爲自己等同於某個特定參考文獻所標識的客體嗎?除非或直到引用您的內容做了會影響該等同性的內容爲止。

對於不可變對象,兩個關係都應該測試值是否相等。對於可變對象,第一個問題應該測試引用等價性,第二個問題應該測試值相等。對於持有對可變類型對象的引用但不會有任何變異的不可變對象,這兩個問題都應測試該封裝對象的值相等。

我個人的建議是可變對象不重寫Object.Equals,但它們提供一個靜態屬性,返回IEqualityComparer測試值的相等性。這就要求 是不可改變封裝了可變對象必須 獲取IEqualityComparer到能夠報告已封裝的對象的 價值的等價關係作爲自己的,任何對象,但有一個IEqualityComparer 將使它可以存儲這樣的事情在例如一個Dictionary提供 他們從未被修改。

相關問題