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

贊助商

分類目錄

贊助商

最新文章

搜索

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

作者:admin    時間:2023-6-12 17:12:35    瀏覽:

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

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

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

第 1 點:平等基礎(chǔ)上的比較

使用==Equals()進行相等比較沒有區(qū)別,除非你在比較“String”比較。

通用比較規(guī)則:無論何時比較變量,它們要么是值類型,要么是引用類型。當(dāng)比較值類型時,它們是在“內(nèi)容”的基礎(chǔ)上進行比較的;當(dāng)比較引用類型時,它們是在“引用”(內(nèi)存位置)而不是“內(nèi)容”的基礎(chǔ)上進行比較的。

==”和“Equals”都遵守上述規(guī)則。

場景 1:值類型比較

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

場景 2:引用類型比較

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

場景 3:字符串比較和對象類型轉(zhuǎn)換

現(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 值時崩潰,請參見下面的打印屏幕。

 

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

==”是 C# 運算符,而“Equals”是多態(tài)方法。所以換句話說,“==”是一種語言特性,而“Equals”是一種遵循多態(tài)性的面向?qū)ο缶幊烫匦浴?/p>

現(xiàn)在比較有兩種類型,一種是純粹基于內(nèi)容和引用,即基于計算機的比較,另一種是基于語義。語義是指事物的實際含義。例如 1 <> 70 在數(shù)字上(技術(shù)上)但在現(xiàn)實世界中在語義上 1 $ = 70 Rs 。

更多示例:

  • 從技術(shù)上講: 1 等于 1。
  • 語義上:-1 美元不等于 1 盧比。
  • 從技術(shù)上講:“目的地”一詞不等于“最后一站”。
  • 語義上:-“目的地”與“最后一站”的含義相同。

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

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