C# 中重载 ==
运算符时,在处理空值时避免无限递归
在 C# 中重载 ==
运算符时,处理空值通常会遇到一个常见问题。考虑以下代码片段:
<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>
在这种情况下,==
重载使用 ==
运算符本身来检查空值。这可能导致无限递归,因为如果 foo1
为空,foo2 == null
也将计算为空,导致 ==
方法无限调用。
为了避免这个问题,==
重载应该使用 ReferenceEquals
而不是 ==
来检查空值。ReferenceEquals
不会执行递归调用,因此它可以安全地确定一个或两个对象是否为空,而不会导致无限递归。更正后的代码如下:
<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
,==
重载有效地处理了空值,而不会触发无限递归。它在继续进行 Equals
比较之前,正确地比较了 foo1
和 foo2
的空值。这种方法确保了运算符的行为始终一致且可靠,即使在存在空值的情况下也是如此。
This revised explanation clarifies the problem and solution more concisely. The image remains in its original format and location.
以上是在 C# 中使用空检查重载'==”运算符时如何避免无限递归?的详细内容。更多信息请关注PHP中文网其他相关文章!