2012-05-17 65 views
3

爲什麼下面的文檔在實現Equals方法時談論不同的方法?關於等於實現的C#不同的MSDN指南

第二份文件(這是最近的)沒有明確執行的Equals(如public bool Equals(MySuperTrooperClass o))的強類型版本。

從一個指導方針中刪除強類型方法,以及我應該在生產代碼中使用哪種方法的根本原因是什麼?

+0

只有當類型實現IEquatable 時,纔會使用強類型。奇怪的是,這些指南都沒有提到IEquatable ...... –

回答

3

刪除強類型版本沒有任何好處。恰恰相反,作爲第一個頁面本身提到

它也建議,除了實現equals (對象),任何類也實現了自己的類型, 等於(型),以提高性能。

這對於值類型是雙重的。

我認爲第二頁完全不涉及這一點,因爲只有弱類型的版本在System.Object上定義。強類型版本通常與執行IEquatable<T>,documentation結合使用,其中提到了Equals(T)Equals(object)之間的交互。

0

您應該實施強類型Equals以提高性能。正如它是寫在第一篇文章中

0

當你要檢查兩件事情有使用==
當你要檢查兩件事情實際上refrencing你使用等於同一個實例相同的值( )。

請記住,只有Equals()爲true,==也必須爲true。

關於GetHashCode() - 在某些情況下包含諸如Dictionary這樣的結構,請使用此特定方法來區分數據。決定如何區分數據取決於您,但GetHashCode()不得在被更改爲正確的對象的值時更改。這意味着它應該在物體壽命期間保持相同的值。

當你做財產以後這樣的:

MyClass A = new MyClass(); 
MyClass B = A; 

當你檢查,如果(A == B)你居然檢查指針地址具有相同的值指針B地址。
因此,您不需要在99.99%的通用開發中實現Equals()。

1

微軟決定在許多原始類型超載Equals的不幸的副作用是,有很多情況下,即使((Object)X).Equals(Y)將表現爲一個等價關係(應該如此),因爲隱式轉換的,X.Equals(Y)不會。例如,3.Equals(3.0)將返回false,但(3.0).Equals(3)將返回true。雖然==運算符並不是很差(通常如果是X==Y,Y==X)它仍然沒有指定等價關係(例如,如果X = Int64.MaxValue,Y = X-1和Z =(Double)X,則X == Z和Y == Z,但是X!= Y)。

也許,微軟放棄了諮詢關於提供的Equals()其行爲相同Equals(Object)超載的原因是,雖然隱式轉換可能使前者不能表現爲一種等價關係,後者應該表現爲一個等價關係,用沒有例外。