首頁 > 後端開發 > C++ > 在 C# 中使用空檢查重載「==」運算子時如何避免無限遞歸?

在 C# 中使用空檢查重載「==」運算子時如何避免無限遞歸?

Linda Hamilton
發布: 2025-01-08 15:52:45
原創
468 人瀏覽過

How to Avoid Infinite Recursion When Overloading the '==' Operator in C# with Null Checks?

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 比較之前,正確地比較了 foo1foo2 的空值。這種方法確保了運算子的行為始終一致且可靠,即使在存在空值的情況下也是如此。

This revised explanation clarifies the problem and solution more concisely. The image remains in its original format and location.

以上是在 C# 中使用空檢查重載「==」運算子時如何避免無限遞歸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板