我了解 == 和 .equals 之间的区别。这里还有很多其他问题可以详细解释差异,例如这个:What is the difference between .Equals and ==这个:Bitwise equality等等。
我的问题是:为什么要同时使用它们(我知道一定有一个很好的理由)- 它们似乎都在做同样的事情(除非以不同方式覆盖)。
什么时候 == 会以不同于 .equals 被覆盖的方式重载?
最佳答案
==
在编译时静态绑定(bind),因为运算符始终是静态的。您重载运算符 - 您无法覆盖它们。 Equals(object)
以多态方式执行,因为它被覆盖了。
就您希望它们何时有所不同而言...
引用类型通常会覆盖 Equals
但根本不会重载 ==
。轻松区分“这两个引用引用同一个对象”和“这两个引用引用相同的对象”之间的区别可能很有用。 (当然,如果需要,您可以使用 ReferenceEquals
- 正如 Eric 在评论中指出的那样,这更清楚。)您希望在执行此操作时真正清楚,请注意你。
double
对 NaN 值有这种行为;当任一操作数为 NaN
时,==(double, double)
将始终返回 false,即使它们是相同的 NaN。 Equals
在不使其契约(Contract)无效的情况下无法做到这一点。 ( Admittedly GetHashCode
is broken for different NaN
values, but that's a different matter ...)
我个人不记得曾经实现过它们来给出不同的结果。
关于c# - 什么时候 == 会以与 .equals 不同的方式被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48120905/