2012-09-13 43 views

回答

1

運算符==在比較對象時調用ReferenceEquals,因此比較對象是否指向相同的內存位置。

Equals,相反,是一個只是虛擬方法,從而可以表現不同不同類型的,因爲它可以被覆蓋。

例如,對於CLR string的Equals比較一個string內容,而不是一個參考,即使string是引用類型。

+0

'=='*可能*調用'ReferenceEquals'。它取決於'@ this'的類型。它可能被覆蓋。 – Servy

2

第一條語句調用對象之間的方法Equals()以查看它們的值是否相等(假設它已被覆蓋並在類T中實現)。第二個語句將比較參考,除非像String類中那樣覆蓋==運算符。

7

那它取決於@this的類型。如果沒有過載==,則第二行將執行直接參考比較,而第一行將調用重寫的Equals方法或實現IEquatable.Equals

任何合理的實現將給出相同的結果進行比較。

+0

好吧,我想我明白了,但爲什麼你不能這樣做@this == default(T)? – dotnetnoob

+0

@ user1437135:您可以在通用方法中比較哪些方面存在限制。我不記得手頭的詳細信息(我沒有這個規範),但是我相信你只能*比較'null',除非你將'T'限制爲引用類型。對於任何不可爲空的值類型,與'null'的比較將始終失敗。 –