在关于 Equals override 的 msdn 指南中,为什么在空检查中强制转换为对象?

发布于 2024-08-10 02:59:51 字数 1035 浏览 7 评论 0原文

我只是在查看 重载 Equals() 的指南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);
}

I was just looking at the Guidelines for Overloading Equals() on msdn (see code below); most of it is clear to me, but there is one line I don't get.

if ((System.Object)p == null)

or, in the second override

if ((object)p == null)

Why not simply

 if (p == null)

What is the cast to object buying us?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月静好 2024-08-17 02:59:51

== 运算符可能会被覆盖,如果是的话,默认的引用比较可能不是您得到的。转换为 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

The == operator may be overridden, and if it is, the default reference comparison may not be what you get. Casting to System.Object ensures that calling == performs a reference equality test.

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
风吹过旳痕迹 2024-08-17 02:59:51

我更喜欢在这种不明确的上下文中使用 object.ReferenceEquals(a, b) 来强制进行引用比较,因为它可以使意图清晰,同时精确地保留语义(事实上,>ReferenceEquals 就是这样实现的)。

I prefer using object.ReferenceEquals(a, b) in this ambiguous context to force reference comparison because it makes the intent clear while preserving the semantics precisely (in fact, ReferenceEquals is implemented like that).

悍妇囚夫 2024-08-17 02:59:51

我想,由于本文还讨论了重写运算符 ==,因此它强制它使用在 Object 上定义的 == 运算符,而不是当前类中的任何重载运算符。

I suppose, since the article also talks about overriding operator==, that it's forcing it to use the == operator defined on Object rather than any overloaded operator in the current class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文