在c#中实现Equals但不是GetHashCode
可能重复:
当Equals方法在C#中被重写时,为什么重写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;
}
}
}
如果你实现了Equals
而不是GetHashCode
,那么如果你的类用于任何使用哈希的数据结构( HashSet<T>
, Dictionary<K,V>
等),它将表现不正确。 即使你没有明确地使用这些数据结构,也有可能它们被一些代码所使用(也就是说,一些Linq操作使用HashSets),所以重写GetHashCode
也更为安全。
GetHashCode
用于存储和检索has表中的对象,也就是判断对象是否相等的另一种方法。
如果你重写一个( Equals
)而不是另一个( GetHashCode
),那么当你使用GetHashCode
(即将你的对象作为一个散列表实现的集合)与Equals()
相比时,你会冒着遇到不一致行为的风险。
您可能会喜欢Eric Lippert在这个主题上阅读这篇文章。
如果你没有实现GetHashCode
,那么当你的类用作字典或散列集等结构中的键时,它的行为会不规律。 如果你想使用这些类型的结构,它是无法绕过它的。 从技术上讲,如果您远离这些应用程序,您的应用程序仍然可以工作,但这种方式很糟糕,并且任何其他使用您的课程的人都会为此感到惊讶。
上一篇: implementing Equals but not GetHashCode in c#
下一篇: GetHashCode override of object containing generic array