【问题标题】:After overloading the operator==, how to compare if two variables points at the same object?重载operator==后,如何比较两个变量是否指向同一个对象?
【发布时间】:2010-10-11 16:36:09
【问题描述】:

重载比较运算符,如果两个变量指向同一个对象(即不是值),如何比较

public static bool operator ==(Landscape a, Landscape b)
{
    return a.Width == b.Width && a.Height == b.Height;
}

public static bool operator !=(Landscape a, Landscape b)
{
    return !(a.Width == b.Width && a.Height == b.Height);
}

【问题讨论】:

  • 我尽量避免为引用类型重载这些运算符,因为大多数人都希望 == 来测试对象相等性。

标签: c# operators operator-overloading equals-operator


【解决方案1】:

我知道这是一个老问题,但如果您要重载 == 或 Object.Equals 方法,您还应该重载反向运算符 !=。

在这种情况下,由于您要比较内部数字,您应该重载其他比较运算符 、=。

将来使用您的类的人,无论是第三方消费者,还是接管您的代码的开发人员,都可能使用 CodeRush 或 Refactor 之类的东西,它们会自动“翻转”逻辑(也称为反转条件)然后将其展平,以突破 25 个嵌套的 if 综合症。如果他们的代码这样做,并且您重载了 == 运算符而没有重载 != 运算符,那么它可能会改变您的代码的预期含义。

【讨论】:

    【解决方案2】:

    使用 Object.ReferenceEquals 静态方法。

    当然,为了让 == 和 != 方法保留其全部功能,您还应该重写 Equals 和 GetHashCode,以便它们向调用者返回一组一致的响应。

    【讨论】:

      【解决方案3】:

      检查两者是否指向同一个对象。您应该使用 Object.ReferenceEquals 方法。如果两者相同或两者都为空,它将返回 true。否则它会返回 false

      【讨论】:

        【解决方案4】:

        【讨论】:

        • ReferenceEquals(object, object)Object 类的静态方法,除非您为其编写扩展方法,否则不能这样使用。要使用它,必须致电:object.ReferenceEquals(a, b)
        猜你喜欢
        • 2010-11-22
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 2012-08-22
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多