如何在 C# 中可靠地检查空值

本文关键字:检查 空值 | 更新日期: 2023-09-27 18:36:08

如何在 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) 不起作用(当然,因为我们在x上调用了一个方法,可以null
  • object o = x; o != null应该使用objectoperator !=,所以它应该可以工作。
  • 别的?

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

如何在 C# 中可靠地检查空值

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

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

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

是的,Microsoft确实建议、ReferenceEquals或强制转换为对象,然后再检查 null。 否则==将被递归调用。这就是微软不得不说的。

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

通过投射到对象,这意味着,

if(((object)yourObject) == null)
{}