ホームページ > バックエンド開発 > C++ > C# で Null チェックを使用して '==' 演算子をオーバーロードするときに無限再帰を回避する方法

C# で Null チェックを使用して '==' 演算子をオーバーロードするときに無限再帰を回避する方法

Linda Hamilton
リリース: 2025-01-08 15:52:45
オリジナル
457 人が閲覧しました

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

C# で == 演算子をオーバーロードする場合、null 値を扱う際の無限再帰を避けてください

C# で == 演算子をオーバーロードするときに null 値を処理するときによくある問題があります。次のコード スニペットを考えてみましょう:

<code class="language-csharp">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);
}</code>
ログイン後にコピー

この場合、== オーバーロードは == 演算子自体を使用して null 値をチェックします。 foo1 が空の場合、foo2 == null も空と評価され、== メソッドが無限に呼び出されるため、これは無限再帰につながる可能性があります。

この問題を回避するには、== オーバーロードで ReferenceEquals の代わりに == を使用して null 値をチェックする必要があります。 ReferenceEquals は再帰呼び出しを実行しないため、無限再帰を引き起こすことなく 1 つまたは 2 つのオブジェクトが null かどうかを安全に判断できます。修正されたコードは次のとおりです:

<code class="language-csharp">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);
}</code>
ログイン後にコピー

ReferenceEquals を使用するように null チェックを変更することで、== オーバーロードは無限再帰を引き起こすことなく null 値を効率的に処理します。 Equals の比較に進む前に、foo1foo2 の null 値を正しく比較します。このアプローチにより、null 値が存在する場合でも、演算子の動作が常に一貫性があり、信頼できることが保証されます。

この改訂された説明では、問題と解決策がより簡潔に明確になっています。画像は元の形式と場所のままです。

以上がC# で Null チェックを使用して '==' 演算子をオーバーロードするときに無限再帰を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート