如何可靠地在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在他们的文档/编码标准/其他方面推荐任何方法吗?
object.ReferenceEquals(x, null)
是最好的选择。 - Alessandro D'Andria(object)x != (object)null
,这将强制使用在C#中预定义的重载运算符operator !=(object x, object y)
,它只是比较两个引用(很可能实现为两个整数“地址”,因此在幕后进行整数相等性检查)。当然,在通常情况下,您可以仅转换一侧(操作数之一),即(object)x != null
或x != (object)null
;编译器仍必须选择预定义的重载,而不是用户定义的重载。 - Jeppe Stig Nielsen