[C#] == VS Equals

聲明:本篇博客翻譯自:https://www.codeproject.com/Articles/1111680/equalsequals-VS-Equals-in-Csharpspa

因爲水平(技術水平+英語理解能力)有限/不足,確定會有所疏漏/錯誤,請及時指正。翻譯

介紹:

在C#中,可使用「==」和一個可重載的"Equals()"方法來對變量進行比較。可是不少開發者並不知道二者之間的區別。在這篇博客中將討論二者之間的區別和二者的使用場景。"=="和"Equals()"比較沒有區別除了在作string的比較時。code

比較規則:C#中的比較無非是對值類型和引用類型進行比較。當對值類型進行比較時,比較的是值類型的「內容」;當對引用類型進行比較時,比較的是對象的引用是否相同(內存地址)而不是「內容」。上述規則對"=="和"Equals()"均適用。對象

場景一:值類型比較

當對值類型(int, double, byte etc)進行比較時, "=="和"Equals()"都是基於值類型的內容比較。當值類型的內容相同,則二者相等。blog

Console.WriteLine("Value Type Compare...");
int i = 10;
int y = 10;
Console.WriteLine(i == y);        // true
Console.WriteLine(i.Equals(y)); // true

場景二:引用類型比較

當對引用類型(object, interface)進行比較時,比較的是引用(內存地址)是否相同,下面代碼中obj1和obj2使用"=="和「Equals」進行比較,結果爲:false.儘管兩個對象的內容同樣的。可是內容地址不同。繼承

class Customer
{
    public string Name { get; set; }
}

Customer obj1 = new Customer();
obj1.Name = "Jimmy-Yang";

Customer obj2 = new Customer();
obj2.Name = "Jimmy-Yang";

Console.WriteLine(obj1 == obj2);        // false
Console.WriteLine(obj1.Equals(obj2));   // false

若是obj1與obj2指向同一個引用(內存地址)。內存

Customer obj1 = new Customer();
obj1.Name = "Jimmy-Yang";

Customer obj2 = obj1;

Console.WriteLine(obj1 == obj2);        // true
Console.WriteLine(obj1.Equals(obj2));   // true

場景三:string比較

string類型是引用類型,那麼下面代碼中"str"建立一個string對象,而且在堆內存塊上存儲"test"字符。當建立str1後,雖然存儲的內容同樣,可是應該存儲在不一樣的內存區域。ci

object str = "test";
object str1 = "test";
Console.WriteLine(str == str1);         // true
Console.WriteLine(str.Equals(str1));    // ture

執行結果發現str與str1是相等的。這是爲何呢?
注意:C#的string類型遵循一條內部的規則。若是str與str1的內容相同,則二者指向系統的的內存地址。所以「==」和"Equals"會返回true。開發

可是注意下面的代碼,咱們建立了一個單獨對象,而後賦值給string類型。此時「==」比較將返回false,Equals()將返回true。這是二者一個不一樣的地方。get

object str = new string(new char[] { 't', 'e', 's', 't' });
object str1 = new string(new char[] { 't', 'e', 's', 't' });
Console.WriteLine(str == str1);         // false
Console.WriteLine(str.Equals(str1));    // true

場景四:編譯時VS運行時

二者之間在作類型檢查時的區別。==在編譯時作類型檢查;Equals()在運行時作類型檢查。請看下面的代碼,在「==」會有一個警告信息。

場景五:NULL

當比較的對象爲null時,「==」不會拋出異常,"Equals()"比較null對象時,會直接crash。

使用場景

"=="是C#提供的一個運算符,「Equals()」是基類提供的一個虛方法,能夠在子類中繼承,並編寫自身比較邏輯。換句話說,「==」是一個C#的一個特性,而Equals是OOP的一個特性。二者的區別一個基於單純的內容和引用(內存地址)比較。另外一種是基於語義(Semantics, 此處我翻譯成語義,其實更確切的應該是對象之間的含義)上的比較。例如:1 <> 10 (從技術層面上講),可是現實生活中,1元=10角,此時1=10在含義上。

  • 若是單純從技術層面上比較請使用「==」;
  • 若是從語義上比較(例如:1元=10角),你須要使用Equals方法並提供合適的比較邏輯。

總結

請看下面的表格:

    ==   Equals
Usage Technical based Semantic based
Value types Content based Comparison Content based Comparison
Objects Reference based Comparison Reference based Comparison
String  Content based Comparison Content based Comparison
String with no interning Reference based Comparison Content based Comparison
Type checking Compile time Run time
Nulls Works  Can crash
相關文章
相關標籤/搜索