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()区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring(3.2.3) - Bean
- 下一篇: c#中跨线程调用windows窗体控件