我只看Guidelines for Overloading Equals() on msdn(见下面的代码);大部分内容对我来说很清楚,但有一条线我没有。
if ((System.Object)p == null)
或者,在第二次覆盖中
if ((object)p == null)
为什么不简单
if (p == null)
购买我们的对象是什么?
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);
}
public bool Equals(TwoDPoint p)
{
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
答案 0 :(得分:11)
==
运算符可能会被覆盖,如果是,则默认参考比较可能不是您得到的。转换为System.Object可确保调用==
执行引用相等性测试。
public static bool operator ==(MyObj a, MyObj b)
{
// don't do this!
return true;
}
...
MyObj a = new MyObj();
MyObj b = null;
Console.WriteLine(a == b); // prints true
Console.WriteLine((object)a == (object)b); // prints false
答案 1 :(得分:3)
我更喜欢在这个模糊的上下文中使用object.ReferenceEquals(a, b)
来强制引用比较,因为它使意图清晰,同时保留语义精确地(事实上,ReferenceEquals
就是这样实现的)。
答案 2 :(得分:2)
我想,因为文章还讨论了重写operator ==,它强制它使用Object上定义的==运算符而不是当前类中的任何重载运算符。