可能重复:为什么在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 回答
如果您实现
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
.GetHashCode
用于存储和检索has表中的对象,即,它是判断对象相等性的另一种方式 .如果您覆盖一个(
Equals
)而不是另一个(GetHashCode
),则在使用GetHashCode
(即,将实现为哈希表的集合中的对象)与Equals()
进行比较时,您将面临遇到不一致行为的风险 .您可能喜欢阅读有关该主题的this post by Eric Lippert .
如果未实现
GetHashCode
,则在用作字典或散列集等结构中的键时,您的类将表现不正常 . 如果你想使用那些类型的结构,那么就会出现错误的形式,而且任何使用你的课程的人都会有一个粗鲁的惊喜 .