如何在 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
应该使用object
的operator !=
,所以它应该可以工作。 - 别的?
那么,哪种方法在可靠性、速度、可读性方面最好,哪种方法最惯用?Microsoft是否推荐他们的文档/编码标准/其他方法中的任何方法?
您可以使用 System.Object 的静态 ReferenceEquals 方法。
这是技术上正确的解决方案。但是,您应该做的是让您的该类的供应商知道这是一坨狗屎,您不会使用它。修复其他人的错误不应该是您的责任。修复自己的错误就足够了。
Microsoft是否推荐他们的文档/编码标准/其他方法中的任何方法?
是的,Microsoft确实建议、ReferenceEquals
或强制转换为对象,然后再检查 null。 否则==
将被递归调用。这就是微软不得不说的。
运算符 == 重载中的一个常见错误是使用 (a == b)、(a == null) 或 (b == null) 来检查引用是否相等。相反,这会导致调用重载运算符 ==,从而导致无限循环。使用 ReferenceEquals 或将类型强制转换为 Object,以避免循环。
通过投射到对象,这意味着,
if(((object)yourObject) == null)
{}