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) 将:
x且y都为null ,则返回truex或y为null,则返回falsex.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
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)
在这里,你真的不想要呼叫的==实现,因为它会永远递归-你要很明确的引用相等语义.