c# - 为什么 GetHashCode 在 Object 类中?

标签 c# .net language-agnostic clr

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

MS 团队决定将此方法包含在 Object 类中并因此使其“随处可用”一定是有原因的。

最佳答案

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

在我的完美世界中:

  • ToString将重命名为 ToDebugString适当设定期望
  • EqualsGetHashCode会消失
  • 会有一个ReferenceEqualityComparer实现IEqualityComparer<T> : 目前这部分的等号很容易,但是如果它被覆盖,就没有办法获得“原始”哈希码
  • 对象不会有与之关联的监视器:Monitor会有一个构造函数,并且 Enter/Exit etc 将是实例方法。

相等性(以及散列)通常会导致继承层次结构出现问题 - 只要您始终可以指定要使用的比较类型(通过 IEqualityComparer<T> )并且对象可以实现 IEquatable<T>如果他们愿意的话,我不明白为什么它应该在 Object 上. EqualityComparer<T>.Default如果 T 可以使用引用实现没有实现 IEquatable<T>否则遵从对象。生活会很愉快。

嗯嗯。当我在做的时候,数组协方差是另一个平台错误。如果你想知道 C# 中的语言错误,如果你愿意,我可以开始另一次小吐槽 ;)(它仍然是我最喜欢的语言,但有些事情我希望以不同的方式完成。)

我已经 blogged about this其他地方,顺便说一下。

关于c# - 为什么 GetHashCode 在 Object 类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3096028/

相关文章:

c# - 必须将对 Bind 的调用分配给模板内控件的属性

.net - application/problem+json 和 .net 6 最小 API?

language-agnostic - Win32 : Is it possible to build an app that houses other apps?

language-agnostic - 人们今天使用的可扩展语言是什么?

c# - DeleteAsync MobileServices 超时

c# - 如何检查 char 数组元素是否为空?

c# - 将数据从行保存到数据库

.net - 为数据表中的所有行设置值,无需 for 循环

design-patterns - 应用程序框架是反模式吗?

c# - WPF:从 viewModel 调用 View 中的方法