|
|
|
|
|
|
為了比較變量之間的相等性,C# 提供了兩種比較方法“==”和重載方法“Equals()”。大多數開發人員使用“==”,而“Equals”幾乎不被討論。
因此,在這篇文章中,我們將討論它們之間的區別以及何時使用什么。

第 1 點:平等基礎上的比較
使用==和Equals()進行相等比較沒有區別,除非你在比較“String”比較。
通用比較規則:無論何時比較變量,它們要么是值類型,要么是引用類型。當比較值類型時,它們是在“內容”的基礎上進行比較的;當比較引用類型時,它們是在“引用”(內存位置)而不是“內容”的基礎上進行比較的。
“==”和“Equals”都遵守上述規則。
當你使用“==”或“Equals”比較值類型/原始數據類型(int、double 等)時,它始終基于內容。在下面的代碼中,你可以看到兩種比較方法都顯示為“true”。
int i = 10;
int y = 10;
Console.WriteLine(i == y); // true
Console.WriteLine(i.Equals(y)); // true
現在,當你比較對象時,它們是根據引用(內部內存指針)進行比較的。下面的 obj 和 obj1 通過“==”或“Equals”進行比較都將為false。所以在下面的代碼中,即使兩個對象的屬性名稱都是“Shiv”,它仍然顯示不相等。因為比較是基于內存引用的,這對于“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
現在字符串是不可變對象或引用類型,因此應使用引用類型規則檢查它們。換句話說,在下面的場景中,當我們將值賦給“str”時,它會創建一個字符串對象,并且在堆中存儲了“test”。當你現在為“str1”分配一個不同的對象時,它應該是一個不同的實例。
但是看看值,它是一樣的。所以C#字符串遵循內部規則。換句話說,如果內容是相同的“str”和“str1”,它們指向相同的內存位置和數據。所以“==”和“Equals”都為true。
object str = "test";
object str1 = "test";
Console.WriteLine(str==str1);
Console.WriteLine(str.Equals(str1));
但是現在看看下面的代碼,我們在其中顯式地創建了具有相同值的新的獨立字符串對象。我們正在強制和覆蓋字符串的內部行為。在下面的代碼中,“==”將返回 false,即使內容相同,而“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”是多態方法。所以換句話說,“==”是一種語言特性,而“Equals”是一種遵循多態性的面向對象編程特性。
現在比較有兩種類型,一種是純粹基于內容和引用,即基于計算機的比較,另一種是基于語義。語義是指事物的實際含義。例如 1 <> 70 在數字上(技術上)但在現實世界中在語義上 1 $ = 70 Rs 。
更多示例:
因此,技術比較是基于計算機的,而語義比較是基于業務的,或者我們可以說存在某種用于比較目的的域規則。
那么現在什么時候使用“==”,什么時候使用“Equals”:
如果你正在尋找技術比較,那么使用“==”,大多數時候“==”就足夠了,因為開發人員主要進行技術比較。
如果你在語義上進行比較,那么你需要在“Equals”上使用語義比較邏輯,并且你需要在比較時使用“Equals”方法。
概括
所以如果我們把所有的點都列出來,最后的結論就是下表。
| == | Equals | |
|---|---|---|
| 使用 | 基于技術 | 基于業務 |
| 值類型 | 基于內容的比較 | 基于內容的比較 |
| 對象 | 基于參考的比較 | 基于參考的比較 |
| 字符串 | 基于內容的比較 | 基于內容的比較 |
| 內有內部的字符串 | 基于參考的比較 | 基于內容的比較 |
| 類型檢查 | 編譯時間 | 運行 |
| 空值 | 可用 | 崩潰 |
相關文章
