几乎每次我想检查对象的相等性null
我都使用正常的相等检查操作
if (obj == null)
最近我注意到我经常使用Object.Equals()
if (Object.Equals(obj, null))
在阅读有关空检查的同时,我设想了这个Is ReferenceEquals(null, obj) the same thing as null == obj?
if (ReferenceEquals(null, obj))
区别是什么?以及何时/何时使用每一个?另外我发现最后两张支票根据他们的summary
答案 0 :(得分:13)
Object.Equals(x, y)
将:
x
和y
都为空x
或y
中只有一个为空x.Equals(y)
或y.Equals(x)
- 不应该。这意味着将调用对象x
或y
引用的执行时类型实现的任何多态行为。 ReferenceEquals
将不调用多态Equals
方法。 只是比较相等的引用。例如:
string x = new StringBuilder("hello").ToString();
string y = new StringBuilder("hello").ToString();
Console.WriteLine(Object.Equals(x, y)); // True
Console.WriteLine(Object.ReferenceEquals(x, y)); // False
Console.WriteLine(x == y); // True due to overloading
现在,如果您仅检查是否存在无效,那么您实际上想要多态行为 - 只是引用相等。所以请随意使用ReferenceEquals
。
你可以 使用==
,但是可以通过类重载(不被覆盖) - 就像字符串一样,如上所示。在我的经验中使用ReferenceEquals
的最常见情况是,当您实施 ==
时:
public bool operator ==(Foo x1, Foo x2)
{
if (ReferenceEquals(x1, x2))
{
return true;
}
if (ReferenceEquals(x1, null) || ReferenceEquals(x2, null))
{
return false;
}
return x1.Equals(x2);
}
在这里你真的不想要调用==
实现,因为它会永远递归 - 你想要非常明确的引用相等语义。