为什么GetHashCode在Object类中?

Inc*_*ito 8 .net c# language-agnostic clr

为什么GetHashCode是Object类的一部分?只有一小部分对象用作哈希表中的键.当我们希望类的对象作为哈希表中的键时,必须实现一个单独的接口,这不是更好吗?

必须有一个原因,MS团队决定将此方法包含在Object类中,从而使其"无处不在".

Jon*_*eet 17

这是从Java,IMO复制的设计错误.

在我完美的世界里:

  • ToString将被重命名ToDebugString以适当地设定期望
  • Equals并且GetHashCode会消失
  • 将会有一个ReferenceEqualityComparer实现IEqualityComparer<T>:此时平等部分很容易,但如果被覆盖则无法获得"原始"哈希码
  • 对象不会有与之关联的监视器:Monitor将具有构造函数,而Enter/ Exitetc将是实例方法.

平等(因而散列)通常会导致继承层次结构中出现问题 - 只要您始终可以指定要使用的比较类型(通过IEqualityComparer<T>),并且对象可以IEquatable<T>根据需要自行实现,我不明白为什么它应该继续Object.EqualityComparer<T>.Default如果T没有实现IEquatable<T>,则可以使用引用实现,否则将推迟到对象.生活会很愉快.

呃,好吧.虽然我在这,但阵列协方差是另一个平台错误.如果你想在C#中出现语言错误,如果你愿意,我可以开始另一个小咆哮;)(它仍然是我最喜欢的语言,但有些事我希望以不同的方式完成.)

我在其他地方写过这篇博文,顺便说一下.

  • 是的,为什么不为语言错误打开另一个线程讨论.我相信会有其他人你喜欢注意像GetHashCode"错误":) (3认同)