为什么 GetHashCode是对象类的一部分?只有一小部分类的对象用作哈希表中的键。当我们希望类的对象作为哈希表中的键时,有一个必须实现的单独接口(interface)不是更好吗。
MS 团队决定将此方法包含在 Object 类中并因此使其“随处可用”一定是有原因的。
最佳答案
这是从 Java 复制的设计错误,IMO。
在我的完美世界中:
-
ToString
将重命名为ToDebugString
适当设定期望 -
Equals
和GetHashCode
会消失 - 会有一个
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/