C#四种相等性判断方法 equals,referenceEquals
C#中的ReferenceEquals、Equals以及==
? ? C#中有一共有四種相等性判斷方法:
//Object中定義的三個(gè)方法 public static bool ReferenceEquals(object objLeft, object objRight); public static bool Equals(object objLeft, object objRight); public virtual bool Equals(object obj);//雙等號(hào) public static bool operator == (MyClass left, MyClass right)? ?
? ? ①Object.ReferenceEquals(left, right)靜態(tài)方法:從名稱(chēng)中便可知它用來(lái)比較兩者是否是相同的引用,我們也永遠(yuǎn)不應(yīng)該去重寫(xiě)該方法。它對(duì)于值類(lèi)型對(duì)象的比較永遠(yuǎn)返回false;對(duì)于兩個(gè)null的比較永遠(yuǎn)返回true。
?
? ? ②Object.Equals(left, right)靜態(tài)方法:該方法也永遠(yuǎn)不需要重寫(xiě),因?yàn)樗罱K會(huì)把判斷權(quán)交給參數(shù)left的實(shí)例Equls方法(代碼如下),因此沒(méi)有必要重寫(xiě)該方法,只需要保證實(shí)例Equals返回想要的結(jié)果即可:
public static bool Equals(object left, object right) {if(object.ReferenceEquals(left,right)) //如果引用相同,則必定相等(包含兩個(gè)都是null的情況){return true;}if(object.ReferenceEquals(left ,null)|| object.ReferenceEquals(null,right)) //若只有一個(gè)是null,則必定不等{return false;}return left.Equals(right);//兩個(gè)都不是null,且也不是同一個(gè)引用,則根據(jù)left的實(shí)例Equals方法來(lái)判斷。 }?
? ? ③Object中的實(shí)例方法Equals,因?yàn)樗翘摲椒?#xff0c;所以可以在其他類(lèi)中重寫(xiě)它。該方法的默認(rèn)實(shí)現(xiàn)還是比較兩者是否為同一個(gè)引用,即相當(dāng)于ReferenceEquals。但是微軟在所有值類(lèi)型的基類(lèi)System.ValueType中重寫(xiě)了該方法,用來(lái)比較值相等。
- 在值類(lèi)型中,我們?nèi)匀豢赡芤貙?xiě)該方法,以提高性能(默認(rèn)方法的性能不高),另外如果我們的struct中包含了引用類(lèi)型的成員,則應(yīng)該重寫(xiě)該方法。
- 在引用類(lèi)型中,如果類(lèi)的實(shí)例要作為字典的鍵,則應(yīng)該重寫(xiě)Equals方法,使之比較值,而不是引用。
? ? 重寫(xiě)Equals應(yīng)該遵循的原則:自反性、對(duì)稱(chēng)性、傳遞性。即:a=a;若a=b,則b=a;若a=b,b=c,則a=c;另外兩個(gè)對(duì)象要么相等要不不等,所以該方法不應(yīng)該拋出異常。下面是重寫(xiě)模板:
public class MyClass:IEquatable<MyClass> {//重寫(xiě)Object中的Equals方法public override bool Equals(object obj){if (object.ReferenceEquals(obj, null)) //首先判斷obj不能為空,否則后面對(duì)obj調(diào)用任何方法都將報(bào)錯(cuò){return false;}if(object.ReferenceEquals(this,obj)) //在C#中this永遠(yuǎn)不會(huì)為空{(diào)return true;}if(this.GetType() != obj.GetType()){return false;}return this.Equals(obj as MyClass);}//實(shí)現(xiàn)IEquatable<T>中的Equals方法public bool Equals(MyClass other){//省略return true;} }?
? ? ④比較運(yùn)算符==:對(duì)于引用類(lèi)型,默認(rèn)是比較引用的(System.String除外),對(duì)于值類(lèi)型默認(rèn)比較值,對(duì)于自定義的結(jié)構(gòu),如果不顯示重載operator ==方法,則無(wú)法使用==。
- 由于在C#中要求比較運(yùn)算符必須成對(duì)重載,重載==運(yùn)算符的同時(shí)也必須重載!=運(yùn)算符,否則也會(huì)產(chǎn)生編譯錯(cuò)誤。
- 如果要重載的話(huà),運(yùn)算符"=="、"!=" ?與 ?Equals方法、GetHashCode方法應(yīng)該同時(shí)被重載,因?yàn)樗麄儜?yīng)該保持同樣的相等邏輯。但不要再==中調(diào)用Equals,最好是在Equals中調(diào)用==。
總結(jié)
以上是生活随笔為你收集整理的C#四种相等性判断方法 equals,referenceEquals的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#中的Lock锁深入理解
- 下一篇: 解决: This application