2009-09-20 77 views
21

假設你有兩個不同的類,每個類都有自己的Equals實現;哪一個被使用?如果其中只有一個有一個呢?或者他們都不是?以下任何一行是否相同?C#:靜態對象.Equals如何檢查相等性?

object .Equals(first, second) 
first .Equals(second) 
second .Equals(first) 

我猜測前兩個可能是等價的,但我並沒有真正的線索。

它真的做了什麼?

回答

40

基本上它做了三兩件事:

  • 檢查引用相等
  • 檢查參考無效(返回false,如果任一值是零(如果這樣返回true);現在空== NULL的情況下已處理)
  • 檢查值平等first.Equals(second)

排序不應該問題,如果兩個價值觀具有良好表現的平等實施,因爲平等應該被實施,使得x.Equals(y)意味着y.Equals(x)。但是,我已經安裝的脫機文檔確實聲明瞭first.Equals(second)(或objA.equals(objB)使用實參參數命名)。 online documentation沒有提到這一點,有趣的是,足夠。

只是爲了讓這一切混凝土,實施看起來是這樣的:

public static bool Equals(object x, object y) 
{ 
    if (x == y) // Reference equality only; overloaded operators are ignored 
    { 
     return true; 
    } 
    if (x == null || y == null) // Again, reference checks 
    { 
     return false; 
    } 
    return x.Equals(y); // Safe as we know x != null. 
} 
+1

必須強調,靜態Object.Equals和虛擬first.Equals(second)之間的主要區別在於,如果first是空引用,後者**將失敗**。 – 2013-01-29 16:59:40

1

默認情況下,物體等效性通過在內存中的對象的地址確定。如果兩個實例具有相同的內存地址,則它們是相同的。

但是,這可以在對象內重載,以便開發人員可以比較兩個對象,即並不是在同一內存位置,仍然被視爲相等。例如,如果您有一個數據訪問層,其中每個對象都有來自數據庫的數據記錄ID,則可以根據ID對比較對象。

您可以通過overload operators來生成此功能。

+0

您不能在C#中覆蓋運算符。您可以*重載*運算符,或*重寫*等於方法。 – 2009-09-20 17:36:55

+0

謝謝,修復它。 – Soviut 2009-09-21 00:19:04