「==」演算子のオーバーロードでの無限再帰を避けるために null チェックを適切に処理します
「==」演算子をオーバーロードする場合は、無限再帰を防ぐために必ず null チェックを適切に処理してください。質問に示されているコード スニペットは、間違ったアプローチを示しています:
<code>if (foo1 == null) return foo2 == null;</code>
この条件では、== の 2 回目の呼び出しで foo1 が空かどうかを再度確認しようとするため、無限再帰が発生し、無限ループが発生します。
正しいコード
この問題を解決し、無限再帰を回避するには、null チェックに object.ReferenceEquals
を使用します。
<code>if (object.ReferenceEquals(foo1, null)) return object.ReferenceEquals(foo2, null);</code>
この条件は、foo1 または foo2 (または両方) が空の場合を正しく処理します。両方のオペランドが空の場合は true を返し、一方または両方のオペランドが空でない場合は false を返します。
完全修正
以下の修正されたコードは、この変更を提供された演算子のオーバーロードに組み込んでいます:
<code>public static bool operator ==(Foo foo1, Foo foo2) { if (object.ReferenceEquals(foo1, null)) return object.ReferenceEquals(foo2, null); return foo1.Equals(foo2); }</code>
この変更により、演算子のオーバーロードは無限再帰を引き起こすことなく null チェックを正しく処理できるようになります。
以上がNull チェックで「==」演算子をオーバーロードするときに無限再帰を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。