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()”相比“= =”復(fù)雜。
--------------------------------------------------------------------------------------------------------
C#中的相等有兩種類型:引用相等(ReferenceEquals)和值相等(Equals)。值相等就是說兩個(gè)對象包含相同的值。而引用相等則比較的是兩個(gè)對象的引用是否是同一個(gè)對象。也就是說,如果ReferenceEquals為True,則Equals必然為True,反過來就不一定了。
這樣的話可以看出來,ReferenceEquals我們沒有比較去管他什么,系統(tǒng)自動(dòng)解決,object類實(shí)現(xiàn)的靜態(tài)RefrenceEquals函數(shù)就夠了。而對于自定義的類型的話,如果想要實(shí)現(xiàn)判斷值相等,是需要重寫Equals函數(shù)的。
我們可以看一下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
先不考慮==號(hào),看幾個(gè)Equals的表現(xiàn),Equals是要實(shí)現(xiàn)值相等比較的效果的,.net?在實(shí)現(xiàn)string的時(shí)候就重寫了Equals(object) ,并添加重載函數(shù)Equals(string) ,因此兩個(gè)比較才會(huì)返回True。而不實(shí)現(xiàn)這兩個(gè)函數(shù)的后果就是都返回False,無法符合Equals函數(shù)應(yīng)有的作用。
?
由此看來,對于之前我的需求:比較兩個(gè)自定義類的內(nèi)容是否相同,還是應(yīng)該重寫Equals(Object),并建議重載對自己的類的實(shí)現(xiàn)Equals(MyClass)。
而對于==運(yùn)算符的解釋為:通過過判斷兩個(gè)引用是否指示同一對象來測試是否相等。也就是引用相等了,可對于上面對string的測試,RefrenceEquals為False時(shí),==卻返回的True,這是因?yàn)檫€有這么一條:當(dāng)類型不可變(即實(shí)例中包含的數(shù)據(jù)不可更改)時(shí),通過重載運(yùn)算符==?來比較值是否相等而不是比較引用是否相等可能會(huì)很有用。
我們大部分情況下寫的自定義類都是可變的,所以一般用不到也不應(yīng)該對==進(jìn)行重載。
轉(zhuǎn)載于:https://www.cnblogs.com/aiqingqing/p/4514782.html
總結(jié)
以上是生活随笔為你收集整理的C# == 和equals()区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring(3.2.3) - Bean
- 下一篇: Vim完全教程