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