在上等于MSDN指导覆盖,为什么投在空检查对象呢?(In the msdn guidance on

2019-09-03 14:40发布

我只是在看指南,查看MSDN重载equals()方法 (见下面的代码); 大部分我很清楚,但有一条线我不明白。

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);
}

Answer 1:

==操作符可以被覆盖,如果是,则默认基准比较可能不是你所得到的。 投射到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


Answer 2:

我更喜欢使用object.ReferenceEquals(a, b)在此背景下暧昧强制参考比较,因为它使意图清晰而准确地保持语义(实际上ReferenceEquals就是这样实现的)。



Answer 3:

我想,既然文章也了解重写==操作符,即它迫使它使用的对象定义的==操作符,而不是在当前类的任何重载操作会谈。



文章来源: In the msdn guidance on Equals override, why the cast to object in the null check?