【问题标题】:How to use Object.GetHashCode() on a type that overrides GetHashCode()如何在覆盖 GetHashCode() 的类型上使用 Object.GetHashCode()
【发布时间】:2011-01-08 14:17:17
【问题描述】:

我有一个实现 IEquatable 的类 A,使用它的字段(例如,A.b 和 A.c)来实现/覆盖 Equals() 和覆盖 GetHashCode(),并且 99% 的时间一切正常。类 A 是继承自接口 D 的层次结构(类 B、C)的一部分;它们都可以一起存储在字典 Dictionary 中,因此当它们都带有自己的默认 Equals()/GetHashCode() 时会很方便。

但是,在构建 A 时,有时我需要做一些工作来获取 A.b 和 A.c 的值;在发生这种情况时,我想存储对正在构建的实例的引用。在这种情况下,我不想使用 A 提供的默认 Equals()/GetHashCode() 覆盖。因此,我正在考虑实现一个 ReferenceEqualityComparer,这意味着强制使用 Object 的 Equals()/GetHashCode() :

    private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
    {
        #region IEqualityComparer<T> Members
        public bool Equals(T x, T y)
        {
            return System.Object.ReferenceEquals(x, y);
        }

        public int GetHashCode(T obj)
        {
            // what goes here? I want to do something like System.Object.GetHashCode(obj);
        }
        #endregion
    }

问题是,由于 A 覆盖了 Object.GetHashCode(),我如何(在 A 之外)为 A 的实例调用 Object.GetHashCode()?

一种方法当然是 A 不实现 IEquatable 并始终为我创建的任何字典提供 IEqualityComparer,但我希望得到不同的答案。

谢谢

【问题讨论】:

  • 你正在给自己挖一个很深的洞。使用 IEqualityComparer. 摆脱困境

标签: c# gethashcode iequatable iequalitycomparer referenceequals


【解决方案1】:

object.ReferenceEquals 的自然匹配是RuntimeHelpers.GetHashCode

有关完整详细信息和ObjectReferenceEqualityComparer&lt;T&gt; 的实现,请参阅此问题的答案:Built-in IEqualityComparer&lt;T&gt; that uses ReferenceEquals

【讨论】:

    【解决方案2】:

    通过互操作调用 CLR 的基本实现:Default implementation for Object.GetHashCode()

    【讨论】:

    • 这个链接对于学术目的来说很有趣,但你真的应该改用RuntimeHelpers.GetHashCode()
    • 没错,不知道那个。它只是调用完全相同的底层互操作方法,因此没有功能差异(但是是的:您应该使用已发布的 API 以防它发生变化等......)
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多