implementing Equals but not GetHashCode in c#
Possible Duplicate:
Why is it important to override GetHashCode when Equals method is overriden in C#?
我不实现对象类的getHashCode方法。所以我得到了一些警告。
有没有一种方法可以检查相等性,我只检查equals方法中的哈希代码,因此实现equals和get hash code,而不获取"object.gethashcode not implemented warning?".
如果我只实现equals而不实现gethashcode,会发生什么?MyClass的实例在我的应用程序中是可更新的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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;
}
}
} |
- stackoverflow.com/questions/371328/…是否回答最多?全部?这个?可能重复?
- 顺便说一句,Equals的实现是大规模的过度杀戮;这只需要return this.x == other.x && this.y == other.y;
- 我来自爪哇世界。在Java中,我将引用与==进行比较。虽然string是C类型中的引用类型,但是它们可以像值类型一样使用(使用==运算符),不像Java中的那样,我将把值相等与Str1..Erras(Str2)进行比较。具体来说,如果我使用this.str1==this.str2-和str1为空,我想我会得到一个空指针异常?
如果您实现Equals而不是GetHashCode,那么如果您的类用于任何使用散列的数据结构(HashSet和Dictionary等),它的行为将不正确。即使您没有显式地使用这些数据结构,也有可能某些代码(例如,某些LINQ操作使用哈希集)使用它们,因此也可以更安全地覆盖GetHashCode。
- 尤其是使用IEqualityComparer实例的linq方法需要正确的哈希代码才能工作。据我所知,这是Except、Distinct、Union和Intersect。
GetHashCode用于在has表中存储和检索对象,也就是说,它是判断对象相等性的另一种方法。
如果您重写一个(Equals而不是另一个(GetHashCode),那么在使用GetHashCode时(即,将对象放在实现为哈希表的集合中)与使用Equals()时,会有遇到不一致行为的风险。
你可能喜欢阅读埃里克·利珀特的这篇关于这个主题的文章。
如果不实现GetHashCode,当在字典或散列集等结构中用作键时,类的行为将不稳定。如果你想使用这些类型的结构,就没有办法了。从技术上讲,如果你远离这些,你的应用程序会工作,但这是一个糟糕的形式,任何其他使用你的课程的人都会得到一个无礼的惊喜。