3

如何在 C# 中可靠地检查空值,包括重载运算符==!=?

class MyClass
{
    public static bool operator ==(MyClass a, MyClass b) { return false; }
    public static bool operator !=(MyClass a, MyClass b) { return true; }
}

class Program {
    static void Main(string[] args) {
        MyClass x = new MyClass();
        MyClass y = null;
        if (x != null) { System.Console.WriteLine(x.ToString()); }
        // Next line throws a NullReferenceException
        if (y != null) { System.Console.WriteLine(y.ToString()); }
    }
}

我知道以下选项可用:

  • x != null重载运算符时不可靠。
  • null != x重载运算符时不可靠。
  • (x ?? null) != null类型仍然是MyClass,因此在重载运算符时不可靠。
  • object.ReferenceEquals(x, null)应该可以。
  • x.Equals(null)不会工作(当然,因为我们调用了一个方法 on x,它可以是null
  • object o = x; o != null应该使用object's operator !=,所以它应该可以工作。
  • 还有什么?

那么,就可靠性、速度、可读性而言,哪种方法最好,哪种方法最惯用呢?Microsoft 是否在其文档/编码标准/其他内容中推荐任何方法?

4

2 回答 2

3

您可以使用 System.Object 的静态ReferenceEquals方法。

这是技术上正确的解决方案。但是,您应该做的是让您的上述课程的供应商知道这是一个有缺陷的狗屎,您不会使用它。修复其他人的错误不应该是您的责任。修复自己的错误就足够了。

于 2013-10-21T10:49:23.263 回答
2

Microsoft 是否在其文档/编码标准/其他内容中推荐任何方法?

是的,Microsoft 确实建议,ReferenceEquals或在检查 null 之前强制转换为对象。否则==将被递归调用。是微软不得不说的。

运算符 == 重载的一个常见错误是使用 (a == b)、(a == null) 或 (b == null) 来检查引用是否相等。相反,这会导致调用重载运算符 ==,从而导致无限循环。使用 ReferenceEquals 或将类型转换为 Object,以避免循环。

通过强制转换为对象意味着,

if(((object)yourObject) == null)
{}
于 2013-10-21T10:28:46.167 回答