可能重复:
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;
}
}
}
答案 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
,那么你的类在用作字典或散列集等结构中的键时会表现不正常。如果你想使用那些类型的结构,那就没办法了。从技术上讲,如果你远离那些应用程序,你的应用程序将会起作用,但它的形式很糟糕,而且任何使用你的课程的人都会有一个粗鲁的意外。