Dot-Net
null == null 嗎?
我有一個類型的對象
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) == trueANDx.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));這產生
false和true。點 d:不,它是同一個對象,相同的記憶體空間 - 如果它們指向對像上的一個欄位。
這實際上是無法訪問的程式碼,
ReferenceEquals()據記錄true,如果兩個操作數都為空,則返回。**編輯:**具體回答您的觀點(d):當
ReferenceEquals返回true時,兩個引用必須相同;所以它們指向同一個對象。因此,除非您在屬性訪問器中執行不可預測的操作,否則 Id 的值將從同一個對像中讀取,並且應該是相同的。(這裡的故事的寓意是,屬性應該以可重複的方式執行,而沒有其他副作用,例如如果沒有設置,則可能分配一個 Id)您完全有可能擁有兩個具有相同
Id但不同引用的對象。例如:Foo a = new Foo(); Foo b = new Foo();
ReferenceEquals()``a比較and時會給出 falseb(因為它們是不同的實例),但除非該建構子執行諸如 allocate an之類的操作Id,否則我希望它們共享該 Id 並且您的相等性檢查將通過。