在學習C#中的記錄類型時,對出現的Equals和ReferenceEquals得到的不同結果表示不理解,隨即進行相關資料查找。 值類型 == : 比較兩者的“內容”是否相同,即“值”是否一樣Equals:比較兩者的“內容”是否相同,即“值”是否一樣ReferenceEquals:返回false,因為 ...
在學習C#中的記錄類型時,對出現的Equals和ReferenceEquals得到的不同結果表示不理解,隨即進行相關資料查找。
值類型
== : 比較兩者的“內容”是否相同,即“值”是否一樣
Equals:比較兩者的“內容”是否相同,即“值”是否一樣
ReferenceEquals:返回false,因為會對值類型進行裝箱再進行比較
引用類型
== : 比較的是引用變數指向的對象在堆中的存儲地址是否一樣
Equals: 比較的是引用變數指向的對象在堆中的存儲地址是否一樣
ReferenceEquals: 比較的是引用變數指向的對象在堆中的存儲地址是否一樣
看完上述解釋後,在分析之前我們先弄明白兩個東西,地址概念和裝箱操作,地址相關概念這裡就不過多贅述了,簡單的說一下裝箱操作:
1 int num = 10; 2 object obj = num; // 裝箱操作 3 4 int num2 = (int)obj; // 拆箱操作 5 6 Console.WriteLine(num2); // 輸出結果為 "10"
上述代碼中的過程是
1、對num進行複製,假定num所指向的記憶體空間地址是 0x1 ;
2、對num進行裝箱操作,此時將創建一個引用類型對象,假定記憶體空間為0x2;
3、對象創建完成後,將值類型(num)的值(10)拷貝到對象當中;
4、此時obj將指向這個對象的記憶體空間地址(0x2);
下麵上正餐
1 int a = 1; 2 int b = 1; 3 Console.WriteLine(ReferenceEquals(a, b)); // output:False 4 Console.WriteLine(Equals(a, b)); // output:True
ReferenceEquals會對《值類型》進行裝箱操作,從而導致地址發生變化最後返回False,而Equals在進行《值類型》比較時,只看數值是否一致
註意:string類型(字元串)無論是使用ReferenceEquals還是Equals都只比較數值(大坑)!!!
1 string a = "1"; 2 string b = "1"; 3 Console.WriteLine(ReferenceEquals(a, b)); // output:True 4 Console.WriteLine(Equals(a, b)); // output:True
參考地址:
ReferenceEquals和 == 和equals()的比較 - 王若伊_恩賜解脫 - 博客園 (cnblogs.com)
C# ==、Equals和ReferenceEquals - 溫故納新 - 博客園 (cnblogs.com)