如何避免运算符重载中处理空值时出现无限递归?
在定义比较运算符的重载时,正确处理空值情况至关重要,以避免无限递归。以下代码演示了 == 运算符重载中的无限递归问题:
<code class="language-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); }</code>
在此场景中,当其中一个操作数为空时,== 运算符重载会递归调用自身。为了避免此问题,需要使用 ReferenceEquals
方法显式检查空值:
<code class="language-c#">Foo foo1 = null; Foo foo2 = new Foo(); Assert.IsFalse(foo1 == foo2); public static bool operator ==(Foo foo1, Foo foo2) { if (object.ReferenceEquals(null, foo1)) return object.ReferenceEquals(null, foo2); return foo1.Equals(foo2); }</code>
通过使用 ReferenceEquals
,重载会在继续进行相等比较之前检查两个操作数是否都为空。这可以防止无限递归并确保在空值情况下行为正确。
以上是处理空值时如何防止运算符重载中的无限递归?的详细内容。更多信息请关注PHP中文网其他相关文章!