c#提供了四種不同的函式來判斷兩個物件是否「相等」:
public static bool referenceequals ( object left, object right );//不要重寫
public static bool equals ( object left, object right );//不要重寫
public virtual bool equals( object right);
public static bool operator==( myclass left, myclass right );
一:public static bool referenceequals ( object left, object right );
該方法都判斷的是「引用相等」,而非「值相等」,即兩個變數指向同乙個物件時返回true。當我們使用它來判斷值型別時,其結果永遠返回false。即使我們將乙個值型別和自身進行比較,referenceequals()的返回值仍是false。
二:public static bool equals ( object left, object right );
該方法並不知道它們的型別,而「相等判斷」又是依賴型別的。答案很簡單:該方法會將判斷的責任交給其中乙個型別來做。事實上,靜態object.equals()方法的實現如下:
public static bool equals( object left, object right )
三:public virtual bool equals( object right);
object.equals()例項方法預設判斷的是「引用相等」,其行為和object.referenceequals()完全一致。
值型別例外。system.valuetype重寫了object.equals()方法。valuetype是所有值型別的基型別。如果兩個值型別變數的型別相同,並且內容一致,這兩個變數才被認為相等。
public override bool equals( object right )
四:public static bool operator==( myclass left, myclass right );
我們永遠都不應該重寫object.referenceequals()靜態方法和object.equals()靜態方法[20],因為它們已經提供了正確的判斷,且該判斷與具體的執行時型別無關。
對於值型別,我們應該總是重寫object.equals()例項方法和 operator==(),從而為它們提供效率較好的「相等判斷」。
對於引用型別,當我們認為相等的含義並非是物件標識相同時,才需要重寫 object.equals()例項方法。
C 判斷物件相等的陷阱
請看下面的測試 object a 11 object b 11 console.writeline a b 輸出false 實際開發過程中,可能不會這麼直觀,例如如下場景,我們要查詢datarow中的字段是否相等,你可能會這樣寫 datarow hbrow needaddrows.where p p...
C 判斷物件相等的陷阱
請看下面的測試 object a 11 object b 11 console.writeline a b 輸出false 實際開發過程中,可能不會這麼直觀,例如如下場景,我們要查詢datarow中的字段是否相等,你可能會這樣寫 datarow hbrow needaddrows.where p p...
C 中相等性判斷
我們在想對乙個可列舉的物件集合進行去重操作時,一般第乙個想到的就是就是linq的distinct方法。先定義乙個類,然後使用distinct方法去重。class man public string name public string adress public decimal weight pub...