假設你有兩個不同的類,每個類都有自己的Equals實現;哪一個被使用?如果其中只有一個有一個呢?或者他們都不是?以下任何一行是否相同?C#:靜態對象.Equals如何檢查相等性?
object .Equals(first, second)
first .Equals(second)
second .Equals(first)
我猜測前兩個可能是等價的,但我並沒有真正的線索。
它真的做了什麼?
假設你有兩個不同的類,每個類都有自己的Equals實現;哪一個被使用?如果其中只有一個有一個呢?或者他們都不是?以下任何一行是否相同?C#:靜態對象.Equals如何檢查相等性?
object .Equals(first, second)
first .Equals(second)
second .Equals(first)
我猜測前兩個可能是等價的,但我並沒有真正的線索。
它真的做了什麼?
基本上它做了三兩件事:
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.
}
默認情況下,物體等效性通過在內存中的對象的地址確定。如果兩個實例具有相同的內存地址,則它們是相同的。
但是,這可以在對象內重載,以便開發人員可以比較兩個對象,即並不是在同一內存位置,仍然被視爲相等。例如,如果您有一個數據訪問層,其中每個對象都有來自數據庫的數據記錄ID,則可以根據ID對比較對象。
您可以通過overload operators來生成此功能。
您不能在C#中覆蓋運算符。您可以*重載*運算符,或*重寫*等於方法。 – 2009-09-20 17:36:55
謝謝,修復它。 – Soviut 2009-09-21 00:19:04
必須強調,靜態Object.Equals和虛擬first.Equals(second)之間的主要區別在於,如果first是空引用,後者**將失敗**。 – 2013-01-29 16:59:40