2

可能重复:
为什么在 C# 中重写 Equals 方法时重写 GetHashCode 很重要?

我没有实现 Object 类的 GetHashCode 方法。所以我收到了一些警告。

有没有办法检查相等性,我只检查 Equals 方法中的哈希码,所以实现 Equals 和 GetHashCode 而不会得到“Object.GetHashCode 未实现警告?”。

如果我只实现 Equals 而没有实现 GetHashCode 会发生什么?myclass 的实例在我的应用程序中是可更新的。

public class MyClass{

private string x;
private string y;

public override bool Equals(object obj)
        {

            try
            {

                 return    Object.Equals(this.x, obj.x)
                        && Object.Equals(this.y, obj.y);

            }
            catch(Exception Ex)
            {
                log.Debug(Ex.StackTrace);
                throw; 
            }
        }

}
4

3 回答 3

3

如果您实现Equals但未实现GetHashCode,那么如果您的类用于任何使用散列( 、 等)的数据结构,HashSet<T>Dictionary<K,V>的行为将不正确。即使您没有显式使用这些数据结构,它们也可能被某些代码使用(即,一些 Linq 操作使用 HashSet),因此直接覆盖GetHashCode也更安全。

于 2012-05-17T21:29:53.003 回答
2

GetHashCode用于存储和检索has表中的对象,即判断对象相等性的另一种方法。

如果您覆盖一个 ( Equals) 而不是另一个 ( GetHashCode),那么在使用GetHashCode(即,将对象放入作为哈希表实现的集合中)与Equals().

您可能会喜欢阅读Eric Lippert关于该主题的这篇文章。

于 2012-05-17T21:29:39.850 回答
1

如果您不实现GetHashCode,则当您的类用作字典或哈希集等结构中的键时,您的类将表现异常。如果你想使用这些类型的结构,没有办法绕过它。从技术上讲,如果您远离这些,您的应用程序将会工作,但这是一种糟糕的形式,任何使用您的类的人都会大吃一惊。

于 2012-05-17T21:30:16.937 回答