日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C# == 和equals()区别

發布時間:2024/1/17 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# == 和equals()区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

 如以下代碼:

?
1 2 3 4 5 int?age = 25; short?newAge = 25; Console.WriteLine(age == newAge);? //true Console.WriteLine(newAge.Equals(age)); //false Console.ReadLine();

  Answers:int和short為原始類型,但與“==”比較返回true,equals()比較返回false。為什么呢?

  簡而言之:

  “equals()”相比“= =”復雜。

--------------------------------------------------------------------------------------------------------

C#中的相等有兩種類型:引用相等(ReferenceEquals)和值相等(Equals)。值相等就是說兩個對象包含相同的值。而引用相等則比較的是兩個對象的引用是否是同一個對象。也就是說,如果ReferenceEquals為True,則Equals必然為True,反過來就不一定了。

這樣的話可以看出來,ReferenceEquals我們沒有比較去管他什么,系統自動解決,object類實現的靜態RefrenceEquals函數就夠了。而對于自定義的類型的話,如果想要實現判斷值相等,是需要重寫Equals函數的。

我們可以看一下string和自定義類的對比:

string?strA = "Hello";

string?strB =?string.Copy(strA);

Console.WriteLine(strA == strB);?????????//True

Console.WriteLine(strA.Equals(strB));????//True

Console.WriteLine(object.Equals(strA, strB));????//True

Console.WriteLine(object.ReferenceEquals(strA, strB));???????//False

class?MyClass

{

????public?int?value?= 1;

}

...

MyClass oA =?new?MyClass();

MyClass oB =?new?MyClass();

Console.WriteLine(oA == oB);???//False

Console.WriteLine(oA.Equals(oB));??//False

Console.WriteLine(object.Equals(oA, oB));??//False

Console.WriteLine(object.ReferenceEquals(oA, oB));?//False

先不考慮==號,看幾個Equals的表現,Equals是要實現值相等比較的效果的,.net?在實現string的時候就重寫了Equals(object) ,并添加重載函數Equals(string) ,因此兩個比較才會返回True。而不實現這兩個函數的后果就是都返回False,無法符合Equals函數應有的作用。

?

由此看來,對于之前我的需求:比較兩個自定義類的內容是否相同,還是應該重寫Equals(Object),并建議重載對自己的類的實現Equals(MyClass)

而對于==運算符的解釋為:通過過判斷兩個引用是否指示同一對象來測試是否相等。也就是引用相等了,可對于上面對string的測試,RefrenceEquals為False時,==卻返回的True,這是因為還有這么一條:當類型不可變(即實例中包含的數據不可更改)時,通過重載運算符==?來比較值是否相等而不是比較引用是否相等可能會很有用

我們大部分情況下寫的自定義類都是可變的,所以一般用不到也不應該對==進行重載

轉載于:https://www.cnblogs.com/aiqingqing/p/4514782.html

總結

以上是生活随笔為你收集整理的C# == 和equals()区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。