|
|
|
|
|
為了比較變量之間的相等性,C# 提供了兩種比較方法“==
”和重載方法“Equals()
”。大多數(shù)開發(fā)人員使用“==
”,而“Equals
”幾乎不被討論。
因此,在這篇文章中,我們將討論它們之間的區(qū)別以及何時使用什么。
第 1 點:平等基礎(chǔ)上的比較
使用==
和Equals()
進行相等比較沒有區(qū)別,除非你在比較“String”比較。
通用比較規(guī)則:無論何時比較變量,它們要么是值類型,要么是引用類型。當(dāng)比較值類型時,它們是在“內(nèi)容”的基礎(chǔ)上進行比較的;當(dāng)比較引用類型時,它們是在“引用”(內(nèi)存位置)而不是“內(nèi)容”的基礎(chǔ)上進行比較的。
“==
”和“Equals
”都遵守上述規(guī)則。
當(dāng)你使用“==
”或“Equals
”比較值類型/原始數(shù)據(jù)類型(int、double 等)時,它始終基于內(nèi)容。在下面的代碼中,你可以看到兩種比較方法都顯示為“true”。
int i = 10;
int y = 10;
Console.WriteLine(i == y); // true
Console.WriteLine(i.Equals(y)); // true
現(xiàn)在,當(dāng)你比較對象時,它們是根據(jù)引用(內(nèi)部內(nèi)存指針)進行比較的。下面的 obj 和 obj1 通過“==
”或“Equals
”進行比較都將為false。所以在下面的代碼中,即使兩個對象的屬性名稱都是“Shiv”,它仍然顯示不相等。因為比較是基于內(nèi)存引用的,這對于“obj”和“obj1”是不同的。
Customer obj = new Customer();
obj.Name = "Shiv";
Customer obj1 = new Customer();
obj1.Name = "Shiv";
Console.WriteLine(obj == obj1); // false
Console.WriteLine(obj.Equals(obj1)); // false
但是下面的代碼將顯示為 true,因為指針指向同一個對象。
Customer obj = new Customer();
obj.Name = "Shiv";
Customer obj1 = obj;
Console.WriteLine(obj == obj1); // true
Console.WriteLine(obj.Equals(obj1)); // true
現(xiàn)在字符串是不可變對象或引用類型,因此應(yīng)使用引用類型規(guī)則檢查它們。換句話說,在下面的場景中,當(dāng)我們將值賦給“str”時,它會創(chuàng)建一個字符串對象,并且在堆中存儲了“test”。當(dāng)你現(xiàn)在為“str1”分配一個不同的對象時,它應(yīng)該是一個不同的實例。
但是看看值,它是一樣的。所以C#字符串遵循內(nèi)部規(guī)則。換句話說,如果內(nèi)容是相同的“str”和“str1”,它們指向相同的內(nèi)存位置和數(shù)據(jù)。所以“==
”和“Equals
”都為true。
object str = "test";
object str1 = "test";
Console.WriteLine(str==str1);
Console.WriteLine(str.Equals(str1));
但是現(xiàn)在看看下面的代碼,我們在其中顯式地創(chuàng)建了具有相同值的新的獨立字符串對象。我們正在強制和覆蓋字符串的內(nèi)部行為。在下面的代碼中,“==
”將返回 false,即使內(nèi)容相同,而“Equals
”將返回 true。這是等號不同的地方。
object str = new string(newchar[] { 't', 'e', 's', 't' });
object str1 = new string(newchar[] { 't', 'e', 's', 't' });
Console.WriteLine(str==str1); // false
Console.WriteLine(str.Equals(str1)); // true
第 2 點:編譯時 VS 運行時
使它們不同的下一點是何時進行類型檢查。“==
”在編譯時進行類型檢查,而“Equals
”更多是在運行時進行。你可以在下面的代碼中看到“==
”如何顯示帶有綠色標志的警告消息,表明你正在比較不同的類型并且可能會遇到問題。“Equals
”不顯示任何此類警告。
第 3 點:NULL 情況
“==
”適用于空值,但“Equals
”在你比較 NULL 值時崩潰,請參見下面的打印屏幕。
“==
”是 C# 運算符,而“Equals
”是多態(tài)方法。所以換句話說,“==
”是一種語言特性,而“Equals
”是一種遵循多態(tài)性的面向?qū)ο缶幊烫匦浴?/p>
現(xiàn)在比較有兩種類型,一種是純粹基于內(nèi)容和引用,即基于計算機的比較,另一種是基于語義。語義是指事物的實際含義。例如 1 <> 70 在數(shù)字上(技術(shù)上)但在現(xiàn)實世界中在語義上 1 $ = 70 Rs 。
更多示例:
因此,技術(shù)比較是基于計算機的,而語義比較是基于業(yè)務(wù)的,或者我們可以說存在某種用于比較目的的域規(guī)則。
那么現(xiàn)在什么時候使用“==
”,什么時候使用“Equals
”:
如果你正在尋找技術(shù)比較,那么使用“==
”,大多數(shù)時候“==
”就足夠了,因為開發(fā)人員主要進行技術(shù)比較。
如果你在語義上進行比較,那么你需要在“Equals
”上使用語義比較邏輯,并且你需要在比較時使用“Equals
”方法。
概括
所以如果我們把所有的點都列出來,最后的結(jié)論就是下表。
== | Equals | |
---|---|---|
使用 | 基于技術(shù) | 基于業(yè)務(wù) |
值類型 | 基于內(nèi)容的比較 | 基于內(nèi)容的比較 |
對象 | 基于參考的比較 | 基于參考的比較 |
字符串 | 基于內(nèi)容的比較 | 基于內(nèi)容的比較 |
內(nèi)有內(nèi)部的字符串 | 基于參考的比較 | 基于內(nèi)容的比較 |
類型檢查 | 編譯時間 | 運行 |
空值 | 可用 | 崩潰 |
相關(guān)文章