C# 为什么在与null比较时强制转换为object?
在浏览关于Equals覆盖的MSDN文档时,有一点引起了我的注意 在的示例中,进行了一些空检查,并在进行比较时将对象强制转换为System.Object type:C# 为什么在与null比较时强制转换为object?,c#,.net,casting,comparison,null,C#,.net,Casting,Comparison,Null,在浏览关于Equals覆盖的MSDN文档时,有一点引起了我的注意 在的示例中,进行了一些空检查,并在进行比较时将对象强制转换为System.Object type: public override bool Equals(System.Object obj) { // If parameter is null return false. if (obj == null) { return false; } // If parameter
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
TwoDPoint p = obj as TwoDPoint;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
是否有使用此强制转换的特定原因,或者它只是本例中忘记的一些“无用”代码?我相信强制转换到System.Object将使您绕过TwoDPoint可能具有的任何运算符重载。类型可能会重载==运算符。cast to对象确保使用原始定义。这可能是==运算符重载的较大示例的一部分。在这种情况下,如果在==定义中调用TwoDPoint.Equals(object),则使用obj==null可能会导致堆栈溢出。正如其他人所说,该类型可能会覆盖==运算符。因此,强制转换到
Object
相当于if(Object.ReferenceEquals(p,null)){…}
它的存在可能是为了避免与重载==运算符混淆。想象一下,如果强制转换不存在,并且==运算符重载。现在,p==null
行可能会绑定到操作符==。运算符==的许多实现只是遵从重写的Equals
方法。这很容易导致堆栈溢出情况
public static bool operator==(TwoDPoint left, TwoDPoint right) {
return left.Equals(right);
}
public override bool Equals(System.Object obj) {
...
TwoDPoint p = obj as TwoDPoint;
if ( p == null ) { // Stack overflow!!!
return false;
}
...
}
通过强制转换到
对象
,作者可以确保对null
进行简单的引用检查(这是预期的)。+1使用ReferenceEquals比强制转换到对象+1对我来说更清楚。使用ReferenceEquals可以更清楚地显示意图。