代码之家  ›  专栏  ›  技术社区  ›  Incognito

为什么GetHashCode在对象类中?

  •  8
  • Incognito  · 技术社区  · 16 年前

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

    7 回复  |  直到 16 年前
        1
  •  19
  •   Asad Saeeduddin    11 年前

    这是一个从Java,IMO复制过来的设计错误。

    在我的完美世界里:

    • ToString 将被重命名 ToDebugString 适当地设定期望
    • Equals GetHashCode 就会消失
    • 会有一个 ReferenceEqualityComparer 实施 IEqualityComparer<T> :这一部分的equals目前很容易,但是如果重写它,就无法获得“原始”哈希代码
    • 对象不会有与其关联的监视器: Monitor 会有一个构造器 Enter / Exit etc将是实例方法。

    相等(以及散列)通常会导致继承层次结构中出现问题—只要您始终可以指定要使用的比较类型(通过 IEqualityComparer<T> )对象可以实现 IEquatable<T> 如果他们想的话,我不明白为什么要开 Object EqualityComparer<T>.Default 可以使用参考实现,如果 T 没有执行 合理<T> 否则就服从于对象。生活会很愉快。

    啊,好吧。当我这么做的时候,数组协方差是另一个平台错误。如果你想在C语言错误,我可以开始另一个小咆哮,如果你喜欢;)(到目前为止,这仍然是我最喜欢的语言,但有些事情我希望能有所不同。)

    blogged about this 另外,顺便说一句。

        2
  •  3
  •   Reed Copsey    16 年前

    在哈希表中,只有一小部分类的对象用作键

    我认为这不是一个真实的说法。许多类经常被用作哈希表中的键,对象引用本身也经常被使用。在System.Object中存在GetHashCode的默认实现意味着任何对象都可以不受限制地用作键。

    这似乎比在对象上强制使用自定义接口要好得多,只是为了能够散列它们。您永远不知道何时需要在哈希集合中使用对象作为键。

    尤其是在使用 HashSet<T> -在这种情况下,对象引用通常用于跟踪和唯一性,而不一定作为“键”。如果哈希需要一个自定义接口,那么许多类将变得不那么有用。

        3
  •  1
  •   erickson    16 年前

        4
  •  0
  •   Aren    16 年前
    1. 那边 HashTable 可以将对象与实现的对象进行比较 IHashable
    2. 推动简单的平等比较。

        5
  •  0
  •   plinth    16 年前

    如果您需要类来实现IHashable,那么对于每个未实现IHashable的密封类,您将在希望将其用作包含哈希功能的键时编写适配器。相反,默认情况下您会得到它。

    哈希代码也是比较对象相等性的第二行(第一行是指针相等性)。

        6
  •  0
  •   Martin Thurau    16 年前

    如果每个类都有GetHashCode,则可以将每个对象放入哈希中。假设您有一个使用第三方对象(您不能修改)并希望将它们放入ab散列中。如果这些对象没有实现你虚构的 IHashable 你做不到。这显然是件坏事;)

        7
  •  0
  •   munificent    16 年前

    这只是猜测,但垃圾收集器可能会在内部存储某些对象的哈希表(可能是为了跟踪可终结的对象),这意味着任何对象都需要有哈希键。

    推荐文章