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
の比較に進む前に、foo1
と foo2
の null 値を正しく比較します。このアプローチにより、null 値が存在する場合でも、演算子の動作が常に一貫性があり、信頼できることが保証されます。
この改訂された説明では、問題と解決策がより簡潔に明確になっています。画像は元の形式と場所のままです。
以上がC# で Null チェックを使用して '==' 演算子をオーバーロードするときに無限再帰を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。