c# - 什么时候 == 会以与 .equals 不同的方式被覆盖?

标签 c# equality

我了解 == 和 .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/

相关文章:

c# - 简化百分比计算c#

c# - 在绘图面板中将鼠标光标更改为铅笔

java - Objects.deepEquals 方法的含义

"within x of"的 JavaScript 运算符

javascript - 等效于 MongoDB 查询中的 JavaScript 非严格比较

c# - 带标签的 slider WinRT

c# - 为什么 .NET List Sort() 不采用显式声明的委托(delegate)对象?

c# - Resharper 建议 : check for reference equality instead

haskell - Haskell 中的函数相等

c# - C# 中的反射是什么,有什么好处。如何使用它来获得好处