什么是Object.Equals(obj,null)和obj == null之间的区别

时间:2011-08-09 08:41:24

标签: c# reference null equals

几乎每次我想检查对象的相等性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

看起来是一样的

1 个答案:

答案 0 :(得分:13)

Object.Equals(x, y)将:

  • 如果xy都为空
  • ,则返回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);
}

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