【问题标题】:Overriding Equality Operators覆盖等式运算符
【发布时间】:2011-07-25 21:56:07
【问题描述】:

我实现了一个重载==!= 运算符的类。

这似乎工作正常;但是,我收到警告 'type' defines operator == or operator != but does not override Object.Equals(object o)

好的,所以我实现了 Equals。但现在我收到警告'type' defines operator == or operator != but does not override Object.GetHashCode()

这会在某个时候结束吗?或者我是否因为想超载==!= 而陷入永无止境的需求轨迹?

【问题讨论】:

  • 快速术语更正:您不覆盖运算符-您重载它们。
  • 当你覆盖Equals时,你也需要覆盖GetHashCode,因为它会根据哈希函数检查相等性。
  • @IgorisAzanovas 不,Equals 不会检查基于哈希函数的相等性(除非您重载它并专门以这种方式对其进行编码)。散列函数用于支持散列集合,预计不会生成唯一值,理想情况下只会生成一个不经常使用的值。

标签: c# operator-overloading equals gethashcode


【解决方案1】:

这会在某个时候结束吗?

是的,一旦你实现了GetHashCode,它就会结束。 Eric Lippertblogged about its importance。我所能做的就是建议你阅读并相信他:-)

【讨论】:

  • 好的,任何人都可以指出一个将整数值转换为合理哈希值的好算法吗?
  • @Darin 为什么我们在重载 "==" 运算符时需要重写 object.equals()?
  • @Jonathon:如果您唯一的识别信息是int,则内置的int 类型将其自身用作其哈希值。如果这对他们来说足够好......
【解决方案2】:

是的,它将在您覆盖 GetHashCode 时结束。

在实现相等运算符以及Equals 时,程序员有责任提供一种实现来为该类型提供自定义哈希码。

详情请见this MSDN reference

【讨论】: