首页 >后端开发 >C++ >在 C# 中使用空检查重载'==”运算符时如何避免无限递归?

在 C# 中使用空检查重载'==”运算符时如何避免无限递归?

Linda Hamilton
Linda Hamilton原创
2025-01-08 15:52:45410浏览

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

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 比较之前,正确地比较了 foo1foo2 的空值。这种方法确保了运算符的行为始终一致且可靠,即使在存在空值的情况下也是如此。

This revised explanation clarifies the problem and solution more concisely. The image remains in its original format and location.

以上是在 C# 中使用空检查重载'==”运算符时如何避免无限递归?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn