這兩個比較表單有什麼區別?這兩個比較陳述有什麼區別?
var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;
顯然,目的是測試對象'@ this'是否爲空。
這兩個比較表單有什麼區別?這兩個比較陳述有什麼區別?
var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;
顯然,目的是測試對象'@ this'是否爲空。
運算符==
在比較對象時調用ReferenceEquals
,因此比較對象是否指向相同的內存位置。
Equals
,相反,是一個只是虛擬方法,從而可以表現不同爲不同類型的,因爲它可以被覆蓋。
例如,對於CLR string
的Equals比較一個string
的內容,而不是一個參考,即使string
是引用類型。
第一條語句調用對象之間的方法Equals()以查看它們的值是否相等(假設它已被覆蓋並在類T
中實現)。第二個語句將比較參考,除非像String
類中那樣覆蓋==
運算符。
那它取決於@this
的類型。如果沒有過載==
,則第二行將執行直接參考比較,而第一行將調用重寫的Equals
方法或實現IEquatable.Equals
。
任何合理的實現將給出相同的結果進行比較。
好吧,我想我明白了,但爲什麼你不能這樣做@this == default(T)? – dotnetnoob
@ user1437135:您可以在通用方法中比較哪些方面存在限制。我不記得手頭的詳細信息(我沒有這個規範),但是我相信你只能*比較'null',除非你將'T'限制爲引用類型。對於任何不可爲空的值類型,與'null'的比較將始終失敗。 –
'=='*可能*調用'ReferenceEquals'。它取決於'@ this'的類型。它可能被覆蓋。 – Servy