object
型別中於相等有關的方法:
public virtual bool equals(object obj);
public static bool referenceequals(object obja, object objb);
public static bool equals(object obja, object objb);
public virtual int gethashcode();
還有個 == 運算子
這多有點亂,乙個個看
實現**如下:
public static bool referenceequals(object obja, object objb)
這個看名字,判斷是否是同乙個引用物件,被比較的兩個物件被轉換為object,然後使用object的 == 運算子來判斷是否相等,object的== 運算子就是判斷兩個物件的位址是否相同,所以該方法用來判斷兩個物件是否引用相同,且定義在object中的靜態方法。
object
的靜態equals方法,實現如下:
public static bool equals(object obja, object objb)
return false;
}
該方法在內部先判斷是否引用相同,相同則返回true,然後在判斷物件obja的equals方法,該方法就是上面的虛方法,所以該方法的實現使用者是可以干預的。
這個在object中定義的虛方法equals,是使用者自定義物件中可以直接覆寫的方法,物件的相等性可以由使用者自由的定義。通過this.equals與傳遞進來的物件進行比較大小,同時該方法的實現也影響了object.equals靜態方法。
object中預設的實現equals虛方法,就是判斷物件是否是引用相同,效果等同於referenceequals
。
public virtual boolean equals(object obj)
所以使用者直接可以干預的就是這個虛方法,重寫該虛方法。對於值型別的system.valuetype已經通過反射複寫了equals,來判斷兩個物件的值相等,但是不高效,建議還是重寫。
public class databag
public databag()
public databag(string code) : this()
public override bool equals(object obj)
}
預設情況下,值型別system.valuetype提供了實現,判斷值是否相等,引用情況下判斷是否引用相同物件,string例外。
這個虛方法需要配合equals虛方法一起進行覆寫,該方法用於獲取物件的雜湊值,要求相同的物件必須具有相同的雜湊值,即equals判斷相等了,那麼gethashcode也應該具有相同的雜湊值,保持語義上的統一。
public override int gethashcode()
這樣就可以安全的將物件座位dictionary的key使用。
使用者最終需要處理的是equals虛方法和gethashcode方法即可,但是對於其他方法也需要熟悉。
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...
判斷物件中每個值是否相等
今天在開發過程中遇到了一些阻力,查詢資料解決了,覺得會經常遇到,記錄一下,時間有限,粗糙記錄。1 物件的操作,賦值,刪除 在操作物件之前,最好深拷貝乙份,否則會影響原本的物件 const clonerow json.parse json.stringify row 去掉物件中的某乙個屬性,比如去掉n...