在c#中实现Equals而不是GetHashCode

时间:2012-05-17 21:25:00

标签: c#

  

可能重复:
  Why is it important to override GetHashCode when Equals method is overriden in C#?

我没有实现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 个答案:

答案 0 :(得分:3)

如果您实施Equals但不是GetHashCode,那么如果您的类用于任何使用散列(HashSet<T>Dictionary<K,V>等)的数据结构中,它将会表现不正确。即使您没有明确地使用这些数据结构,它们也可能被某些代码使用(即,某些Linq操作使用HashSets),因此仅覆盖GetHashCode也更安全。

答案 1 :(得分:2)

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

如果您覆盖一个(Equals)而不是另一个(GetHashCode),那么在使用GetHashCode时会遇到遇到不一致行为的风险(即,在集合中删除对象)实现为哈希表)与Equals()

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

答案 2 :(得分:1)

如果你没有实现GetHashCode,那么你的类在用作字典或散列集等结构中的键时会表现不正常。如果你想使用那些类型的结构,那就没办法了。从技术上讲,如果你远离那些应用程序,你的应用程序将会起作用,但它的形式很糟糕,而且任何使用你的课程的人都会有一个粗鲁的意外。