在c#中实现Equals而不是GetHashCode


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;
            }
        }

}


如果您实现Equals而不是GetHashCode,那么如果您的类用于任何使用散列的数据结构(HashSetDictionary等),它的行为将不正确。即使您没有显式地使用这些数据结构,也有可能某些代码(例如,某些LINQ操作使用哈希集)使用它们,因此也可以更安全地覆盖GetHashCode


GetHashCode用于在has表中存储和检索对象,也就是说,它是判断对象相等性的另一种方法。

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

你可能喜欢阅读埃里克·利珀特的这篇关于这个主题的文章。


如果不实现GetHashCode,当在字典或散列集等结构中用作键时,类的行为将不稳定。如果你想使用这些类型的结构,就没有办法了。从技术上讲,如果你远离这些,你的应用程序会工作,但这是一个糟糕的形式,任何其他使用你的课程的人都会得到一个无礼的惊喜。