C# 中重載 ==
運算子時,在處理空值時避免無限遞歸
在 C# 中重載 ==
運算子時,處理空值通常會遇到一個常見問題。考慮以下程式碼片段:
Foo foo1 = null; Foo foo2 = new Foo(); Assert.IsFalse(foo1 == foo2); public static bool operator ==(Foo foo1, Foo foo2) { if (foo1 == null) return foo2 == null; // 潜在的无限递归 return foo1.Equals(foo2); }
在這種情況下,==
重載使用 ==
運算子本身來檢查空值。這可能導致無限遞歸,因為如果 foo1
為空,foo2 == null
也會計算為空,導致 ==
方法無限呼叫。
為了避免這個問題,==
重載應該使用 ReferenceEquals
而不是 ==
來檢查空值。 ReferenceEquals
不會執行遞歸調用,因此它可以安全地確定一個或兩個物件是否為空,而不會導致無限遞歸。修正後的程式碼如下:
Foo foo1 = null; Foo foo2 = new Foo(); Assert.IsFalse(foo1 == foo2); public static bool operator ==(Foo foo1, Foo foo2) { if (object.ReferenceEquals(foo1, null)) return object.ReferenceEquals(foo2, null); return foo1.Equals(foo2); }
透過修改空值檢查以使用 ReferenceEquals
,==
重載有效地處理了空值,而不會觸發無限遞歸。它在繼續進行 Equals
比較之前,正確地比較了 foo1
和 foo2
的空值。這種方法確保了運算子的行為始終一致且可靠,即使在存在空值的情況下也是如此。
This revised explanation clarifies the problem and solution more concisely. The image remains in its original format and location.
以上是在 C# 中使用空檢查重載「==」運算子時如何避免無限遞歸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!