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

Ram*_*eef 2 c# null reference equals

几乎每次我想检查对象的相等性null我都使用正常的相等检查操作

if (obj == null)
Run Code Online (Sandbox Code Playgroud)

最近我注意到我Object.Equals()经常使用它

if (Object.Equals(obj, null))
Run Code Online (Sandbox Code Playgroud)

在阅读有关空检查的同时,我将这个引用的是引用等于(null,obj)与null == obj相同的东西吗?

if (ReferenceEquals(null, obj))
Run Code Online (Sandbox Code Playgroud)

有什么不同?以及何时/何时使用每一个?再加上我发现最后两张支票根据他们的说法看起来是一样的summary

Jon*_*eet 13

Object.Equals(x, y) 将:

  • 如果xy都为null ,则返回true
  • 如果恰好其中一个xy为null,则返回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
Run Code Online (Sandbox Code Playgroud)

现在,如果你只是检查无效,那么你真的不想要多态行为 - 只是引用相等.所以随意使用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);
}
Run Code Online (Sandbox Code Playgroud)

在这里,你真的想要呼叫的==实现,因为它会永远递归-你要很明确的引用相等语义.