重载了运算符==之后,如何比较两个变量是否指向同一个对象?

6

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

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

1
我尽量避免为引用类型重载这些运算符,因为大多数人都希望“==”测试对象相等性。 - Ed S.
4个回答

9

使用Object.ReferenceEquals静态方法。

当然,为了让==和!=方法保持其完整的功能,您还应该覆盖Equals和GetHashCode方法,以便它们向调用者返回一致的响应集。


5

ReferenceEquals(object, object)Object 类的一个静态方法,除非你编写一个扩展方法,否则不能像那样使用它。要使用它,必须调用:object.ReferenceEquals(a, b) - Şafak Gür

5

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


1

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

而且在这种情况下,由于你正在比较内部数字,你应该重载其他比较运算符 <、>、<=、>=。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接