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

如何对重写GetHashCode()的类型使用object.getHashCode()。

  •  3
  • Jimmy  · 技术社区  · 16 年前

    我有一个实现IEquatable<>、使用其字段(例如,a.b和a.c)实现/重写equals()和重写gethashcode()的类A,99%的时间内一切正常。类A是所有继承自接口D的层次结构(类B、C)的一部分;它们都可以存储在字典字典中,因此当它们都带有自己的默认equals()/gethashcode()时很方便。

    然而,在构建A时,有时需要做一些工作来获取A.B和A.C的值;当这发生时,我希望存储对正在构建的实例的引用。在这种情况下,我不想使用a提供的默认equals()/gethashcode()重写。因此,我考虑实现一个referenceEqualityComparer,这意味着强制使用对象的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
        }
    

    问题是,由于一个重写object.getHashCode(),我如何(在a之外)调用object.getHashCode()来获取的一个实例?

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

    谢谢

    2 回复  |  直到 16 年前
        1
  •  7
  •   Community Mohan Dere    9 年前

    自然搭配 object.ReferenceEquals RuntimeHelpers.GetHashCode .

    有关详细信息和 ObjectReferenceEqualityComparer<T> : Built-in IEqualityComparer<T> that uses ReferenceEquals

        2
  •  -1
  •   Community Mohan Dere    9 年前

    通过interop调用clr的基本实现: Default implementation for Object.GetHashCode()