2011-08-09 179 views
2

幾乎每次我想檢查對象與null的相等性時我都使用正常的等式檢查操作什麼是Object.Equals(obj,null)和obj == null之間的區別

if (obj == null) 

最近我注意到我經常使用Object.Equals()

if (Object.Equals(obj, null)) 

並且在讀取null時檢查我這個Is ReferenceEquals(null, obj) the same thing as null == obj?

if (ReferenceEquals(null, obj)) 

有什麼區別?以及何時/何時使用每一個?另外,根據他們的summary

,我發現最後兩個檢查看起來是一樣的

回答

12

Object.Equals(x, y)將:

  • 返回true,如果xy都是空
  • 返回false如果xy只有一個爲空
  • 否則請致電x.Equals(y)y.Equals(x) - 它應該不是的問題。這意味着無論多態行爲是由執行時間類型的對象x還是y引用都會被調用。

ReferenceEquals調用多態Equals方法。它只是比較相等的參考。例如:

string x = new StringBuilder("hello").ToString(); 
string y = new StringBuilder("hello").ToString(); 
Console.WriteLine(Object.Equals(x, y)); // True 
Console.WriteLine(Object.ReferenceEquals(x, y)); // False 
Console.WriteLine(x == y); // True due to overloading 

現在,如果你只檢查無效,那麼你真的不想要多態行爲 - 只是參考平等。所以請隨時使用ReferenceEquals

你可以使用==,但是,可以是重載(未覆蓋)由類 - 它是在字符串的情況下,如上所示。在我的經驗,使用ReferenceEquals最常見的情況是,當你實施==

public bool operator ==(Foo x1, Foo x2) 
{ 
    if (ReferenceEquals(x1, x2)) 
    { 
     return true; 
    } 
    if (ReferenceEquals(x1, null) || ReferenceEquals(x2, null)) 
    { 
     return false; 
    } 
    return x1.Equals(x2); 
} 

這裏你真的要撥打的==實現,因爲它會永遠遞歸 - 你想非常明確的引用平等語義。

+0

你如何改變一個帖子的內容而不顯示爲已編輯? –

+1

@Rune:如果您在發佈的前5分鐘內對其進行編輯,則不會顯示。 –

相關問題