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)
在这里,你真的不想要呼叫的==
实现,因为它会永远递归-你要很明确的引用相等语义.