在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 ,那么当你的类用作字典或散列集等结构中的键时,它的行为会不规律。 如果你想使用这些类型的结构,它是无法绕过它的。 从技术上讲,如果您远离这些应用程序,您的应用程序仍然可以工作,但这种方式很糟糕,并且任何其他使用您的课程的人都会为此感到惊讶。

链接地址: http://www.djcxy.com/p/39781.html

上一篇: implementing Equals but not GetHashCode in c#

下一篇: GetHashCode override of object containing generic array