聲明:本篇博客翻譯自: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類型是引用類型,那麼下面代碼中"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
二者之間在作類型檢查時的區別。==在編譯時作類型檢查;Equals()在運行時作類型檢查。請看下面的代碼,在「==」會有一個警告信息。
當比較的對象爲null時,「==」不會拋出異常,"Equals()"比較null對象時,會直接crash。
"=="是C#提供的一個運算符,「Equals()」是基類提供的一個虛方法,能夠在子類中繼承,並編寫自身比較邏輯。換句話說,「==」是一個C#的一個特性,而Equals是OOP的一個特性。二者的區別一個基於單純的內容和引用(內存地址)比較。另外一種是基於語義(Semantics, 此處我翻譯成語義,其實更確切的應該是對象之間的含義)上的比較。例如:1 <> 10 (從技術層面上講),可是現實生活中,1元=10角,此時1=10在含義上。
請看下面的表格:
== | 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 |