物体之间的区别是什么?等于(obj, null)和obj == null
本文关键字:obj null 等于 之间 区别 是什么 | 更新日期: 2023-09-27 18:04:48
几乎每次我想检查对象是否与null
相等时,我都使用正常的相等检查操作
if (obj == null)
最近我注意到我更经常使用Object.Equals()
if (Object.Equals(obj, null))
,而阅读关于空检查我发现这是ReferenceEquals(null, obj)相同的东西为null == obj?
if (ReferenceEquals(null, obj))
有什么区别?在哪里/什么时候使用它们?另外,我发现最后两个检查看起来是一样的,根据他们的summary
Object.Equals(x, y)
will:
- 如果
x
和y
都为null返回true - 如果
x
或y
恰好有一个为空则返回false - 否则调用
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);
}
这里你真的不想调用==
实现,因为它会永远递归-你想要非常明确的引用相等语义。