物体之间的区别是什么?等于(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

物体之间的区别是什么?等于(obj, null)和obj == null

Object.Equals(x, y) will:

  • 如果xy都为null返回true
  • 如果xy恰好有一个为空则返回false
  • 否则调用x.Equals(y)y.Equals(x) -它不应该关系。这意味着xy所引用的对象的执行时类型所实现的任何多态行为都将被调用。

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);
}

这里你真的不想调用==实现,因为它会永远递归-你想要非常明确的引用相等语义。