Dot-Net

null == null 嗎?

  • November 10, 2011

我有一個類型的對象Foo

Foo 有一個Id(int)

a)下面的程式碼“好”嗎?

b) 如果兩者都為空,我應該返回什麼?

// overload operator ==
public static bool operator ==(Foo a, Foo b)
{
   if (ReferenceEquals(x, y))
   {
       return true;
   }

   if (x == null && y == null)
   {
       return // ??? 
   }

   if (x == null || y == null)
   {
       return false; 
   }

   return x.Id == y.Id; // Ids are the same
}

public static bool Equals(Foo x, Foo y)
{
  return x == y;
}

編輯:

c) Equals方法是否應該呼叫**== 運算符**,反之亦然?

最後一個問題

d) 有可能 ReferenceEquals(x, y) == true AND x.Id != y.Id嗎?

是的

null只不過是值為零的內部指針。所以它正在比較兩個值為零的引用。

事實上object.ReferenceEquals(null, null)總是如此,因為這個事實所以你不需要第二次檢查。

if (ReferenceEquals(x, y))
{
   return true;
}

if (x == null && y == null) // THIS CHECK IS REDUNDANT!!!
{
   return true;
}

最後一點, == 和 Equals 的處理方式相同,除非在裝箱的值類型上:

       object s1 = 2;
       object s2 =  1+1;

       Console.WriteLine(s1 == s2);
       Console.WriteLine(s1.Equals(s2));

這產生falsetrue

點 d:,它是同一個對象,相同的記憶體空間 - 如果它們指向對像上的一個欄位。

這實際上是無法訪問的程式碼,ReferenceEquals()記錄true,如果兩個操作數都為空,則返回。

**編輯:**具體回答您的觀點(d):當ReferenceEquals返回true時,兩個引用必須相同;所以它們指向同一個對象。因此,除非您在屬性訪問器中執行不可預測的操作,否則 Id 的值將從同一個對像中讀取,並且應該是相同的。(這裡的故事的寓意是,屬性應該以可重複的方式執行,而沒有其他副作用,例如如果沒有設置,則可能分配一個 Id)

您完全有可能擁有兩個具有相同Id但不同引用的對象。例如:

Foo a = new Foo();
Foo b = new Foo();

ReferenceEquals()``a比較and時會給出 false b(因為它們是不同的實例),但除非該建構子執行諸如 allocate an之類的操作Id,否則我希望它們共享該 Id 並且您的相等性檢查將通過。

引用自:https://stackoverflow.com/questions/4077418