您好,登錄后才能下訂單哦!
本篇文章為大家展示了Equals、==和RefrenceEquals的區別是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
我們這里將簡單對比Equals、==和RefrenceEquals的區別,我們將從引用類型的比較以及類型來進行分析。
今天無意看到一篇有關Equals和==的區別的帖子,帖子中間簡單的說成是比較引用和比較值,這樣的理解很有問題。
看了看MSDN,總結如下。
從兩個方面來說說這三者的區別。
先給出一個類和一個結構:
public class RefrenceClass { public int X {get;set;} public string Y {get;set;} } public struct ValueStruct { public int x; public string y; }
1.引用類型的比較
看看以下這段代碼會輸出何種結果
RefrenceClass c1 = new RefrenceClass(); c1.X = 1; c1.Y = "OK"; RefrenceClass c2 = new RefrenceClass(); c2.X = 1; c2.Y = "OK"; RefrenceClass c3 = new RefrenceClass(); c3.X = 1; c3.Y = "OK!"; RefrenceClass c4 = new RefrenceClass(); c4.X = 2; c4.Y = "OK"; RefrenceClass c5 = new RefrenceClass(); c5=c1; c5.X = 2; RefrenceClass c6 = c1; Console.WriteLine(ReferenceEquals(c1,c2).ToString()); Console.WriteLine(ReferenceEquals(c1,c3).ToString()); Console.WriteLine(ReferenceEquals(c1,c4).ToString()); Console.WriteLine(ReferenceEquals(c1,c5).ToString()); Console.WriteLine(ReferenceEquals(c1,c6).ToString()); Console.WriteLine(); Console.WriteLine(Equals(c1,c2).ToString()); Console.WriteLine(Equals(c1,c3).ToString()); Console.WriteLine(Equals(c1,c4).ToString()); Console.WriteLine(Equals(c1,c5).ToString()); Console.WriteLine(Equals(c1,c6).ToString()); Console.WriteLine(); Console.WriteLine(c1.Equals(c2).ToString()); Console.WriteLine(c1.Equals(c3).ToString()); Console.WriteLine(c1.Equals(c4).ToString()); Console.WriteLine(c1.Equals(c5).ToString()); Console.WriteLine(c1.Equals(c6).ToString()); Console.WriteLine(); Console.WriteLine(c1==c2); Console.WriteLine(c1==c3); Console.WriteLine(c1==c4); Console.WriteLine(c1==c5); Console.WriteLine(c1==c6); Console.WriteLine();c1,c2,c3,c4為不同的實例,c1,c5,c6是同一個引用
返回的結果都是 前三個比較為false,后兩個為true
由結果看,靜態RefrenceEquals、靜態Equals、虛擬Equals和==比較的都是引用地址
而當我們換成比較Struct的時候,靜態RefrenceEquals的結果均為false,靜態Equals、虛擬Equals的結果為true,false,false,false,true,==不可用在此處由這個結果看靜態Equals、虛擬Equals比較的是值
這就和我們上面得出的結果不一樣了,那到底比較的是什么呢?
我們按類型來分析:
1.靜態RefrenceEquals,從方法名也可以看出比較的是引用地址,在對值類型進行此比較時,始終為false,即使是RefrenceEauals(1,1),因為這里它把值首先裝箱再進行比較,所以兩個的引用地址是不一樣的,但是RefrenceEquals(null,null)的值是true;
2.靜態Equals方法,這個方法其實最終是調用了虛擬Equals方法的不同重載
3.虛擬Equals方法,可在不同類中重載,這里我們就可以理解為什么上面的兩種不同類型變量的比較會有不同的結果了,比如String.Equals方法就是用于判斷兩個字符串的內容是否相等
一般來說,對于值類型,類型相同,并且數值相同(對于struct的每個成員都必須相同),則Equals返回true,否則返回false。而對于引用類型,默認的行為與ReferenceEquals的行為相同,僅有兩個對象指向同一個Reference的時候才返回true。靜態Equals相比虛擬Equals方法有一個優點,就在于它不用考慮比較的對象是否為null;
4.==運算符,對于內置的值類型,直接判斷兩個對象的值是否相等,并會根據需要對對象進行類型轉換,對于用戶定義的值類型,比如struct,不可使用;杜宇引用類型,默認的行為與ReferenceEquals的行為相同,但是很多類對==進行了重載,比如String。
上述內容就是Equals、==和RefrenceEquals的區別是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。