技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類(lèi)目錄

贊助商

最新文章

搜索

比較C#里==與Equals()有何區(qū)別以及何時(shí)使用它們

作者:admin    時(shí)間:2023-6-12 17:12:35    瀏覽:

為了比較變量之間的相等性,C# 提供了兩種比較方法“==”和重載方法“Equals()”。大多數(shù)開(kāi)發(fā)人員使用“==”,而“Equals”幾乎不被討論。

因此,在這篇文章中,我們將討論它們之間的區(qū)別以及何時(shí)使用什么。

比較C#里==與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ī)則。

場(chǎng)景 1:值類(lèi)型比較

當(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

場(chǎng)景 2:引用類(lèi)型比較

現(xiàn)在,當(dāng)你比較對(duì)象時(shí),它們是根據(jù)引用(內(nèi)部?jī)?nèi)存指針)進(jìn)行比較的。下面的 objobj1 通過(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

場(chǎng)景 3:字符串比較和對(duì)象類(lèi)型轉(zhuǎn)換

現(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)下面的打印屏幕。

 

何時(shí)使用什么:技術(shù)比較 VS 語(yǔ)義比較

==”是 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ù)上講: 1 等于 1。
  • 語(yǔ)義上:-1 美元不等于 1 盧比。
  • 從技術(shù)上講:“目的地”一詞不等于“最后一站”。
  • 語(yǔ)義上:-“目的地”與“最后一站”的含義相同。

因此,技術(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)文章

標(biāo)簽: ==運(yùn)算符  Equals方法  CSharp  
x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */