C# ==、Equals、ReferenceEquals 區別與聯系


基礎知識:參考:cyoooo7博客 區別和認識四個判等函數

==運算符:  

引用類型:默認 ==運算符 是比較引用的地址即內存地址 FCL String 類型因為有字符串駐留機制: string A="a"; string B="a"; 返回為True. 引用類型Equals方法和operator==具有相同的默認行為。

值類型:因為如果你沒有為自定義值類型重載operator==的話,就不能寫這樣的代碼“myStruct1 == myStruct2”,否則會得到一個編譯錯誤,原因是值類型沒有相等操作符重載的默認實現。

ReferenceEquals:

Object的靜態方法。因此不能在繼承類中重寫該方法。原型是:public static bool ReferenceEquals(object objA, object objB);FCL已經幫我們實現。它就是比較引用指向的內存地址一樣。判斷值類型的時候需要裝箱,肯定返回false.FCL String 類型因為有字符串駐留機制: string A="a"; string B="a"; 返回為True.

Equals:  Object類有2個:一個為虛方法,一個為靜態方法

                  public virtual bool Equals(object obj);

                  public static bool Equals(object objA, object objB);

值類型:

重寫引用類型的Equals方法以改變其默認的比較方式的一個著名例子是String類。當我們寫出“string1.Equals(string2)” 這樣的代碼時,我們比較的不是string1和string2這兩個引用所指向的是否為同一個實例(引用等同性),而是比較string1與 string2所包含的字符序列是否相同(邏輯等同性)。

有些人認為值類型的Equals默認實現就是通過比較兩個對象在內存中的位表示,即如果所有的二進制位都相等,則說明這兩個對象“等同”。這是不准確的。 因為其實值類型的Equals默認實現是對值類型的每個字段都調用該字段類型的Equals方法,如果所有字段的Equals方法都返回true,則他們 才可能相等。

引用類型:引用類型Equals方法的默認實現來自Object,而值類型的默認實現來自TypeValue

            就算Equals會使用==操作符,使用的也是Object或TypeValue的重載版本。原則上來說,只要我們沒有重寫一個類的Equals方法,那么它就會 繼承其父類的實現,

           而父類是沒有機會使用子類型的操作符重載的。同樣,只要我們沒有在一個類的==操作符重載中調用Equals方法,它是不會自動調用 的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM