“ ==”“ Equals”之間的差別。

Equals 方法只是在 System.Object 中定義的一個虛擬方法,它由任何選擇執行該任務的類所重寫。== 運算符是一個可由類重載的運算符,該類通常具有恆等行爲。

對於未重載 == 的引用類型,該運算符會比較兩個引用類型是否引用同一對象,而這恰好是 System.Object 中的 Equals 實現所做的工作。

對於未重載 == 的值類型,該運算符會比較這兩個值是否"按位"相等,即是否這兩個值中的每個字段都相等。當您對值類型調用 Equals 時,仍然會發生這一情況,但這一次,該實現是由 ValueType 提供的,並且使用反射進行比較,從而使比較速度比特定於類型的實現慢很多。

到此爲止,二者是如此類似。二者之間的主要區別是多態。運算符被重載而不是被重寫,這意味着除非編譯器知道調用更爲具體的版本,否則它只是調用恆等版本。爲闡明這一點,請看下面這個示例:

using System;
public class Test

{

static void Main()

{

// Create two equal but distinct strings

string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});

string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});

Console.WriteLine (a==b);

Console.WriteLine (a.Equals(b));

// Now let's see what happens with the same tests but

// with variables of type object

object c = a;

object d = b;

Console.WriteLine (c==d);

Console.WriteLine (c.Equals(d));

}

}

 

結果是:

True

True

False

True

 

第三行是 False,原因在於編譯器不知道 c 和 d 的內容都是字符串引用,因而只能調用 == 的非重載版本。因爲它們是對不同字符串的引用,所以恆等運算符返回 False。

那麼,應該如何區別使用這些運算符呢?我的準則是:對於幾乎所有引用類型,當您希望測試相等性而不是引用一致性時,請使用 Equals。例外的情況是字符串 - 使用 == 比較字符串確實會使事情簡單得多,而且代碼可讀性更好,但是 您需要記住,該運算符的兩端都必須是類型字符串表達式,才能使比較正常進行。

對於值類型,我通常使用 ==,因爲除非值類型本身包含引用類型(這種情況極爲罕見),否則是恆等還是相等的問題無關緊要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章