首页 文章

在c#[duplicate]中实现Equals而不是GetHashCode

提问于
浏览
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; 
            }
        }

}

3 回答

  • 2

    如果您实现 Equals 但不实现 GetHashCode ,那么如果您的类用于任何使用散列的数据结构( HashSet<T>Dictionary<K,V> 等),它将表现不正确 . 即使你没有't explicitly use those data structures, it'可能他们're used by some code (i.e., some Linq operations use HashSets), so it'更安全,只是覆盖 GetHashCode .

  • 1

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

    如果您覆盖一个( Equals )而不是另一个( GetHashCode ),则在使用 GetHashCode (即,将实现为哈希表的集合中的对象)与 Equals() 进行比较时,您将面临遇到不一致行为的风险 .

    您可能喜欢阅读有关该主题的this post by Eric Lippert .

  • 3

    如果未实现 GetHashCode ,则在用作字典或散列集等结构中的键时,您的类将表现不正常 . 如果你想使用那些类型的结构,那么就会出现错误的形式,而且任何使用你的课程的人都会有一个粗鲁的惊喜 .

相关问题