正确实现GetHashCode

时间:2012-01-25 20:27:50

标签: c# .net equals

我想听听社区关于如何为我的对象实现GetHashCode(或覆盖它)的消息。我理解如果我覆盖equals方法,我需要这样做。我已经实现了相当多的次数,有时只是调用基本方法。我知道如果对象包含相同的细节(成员),我的对象应该等于对象的另一个实例。从班级成员那里获取哈希码的最佳方法是什么?

1 个答案:

答案 0 :(得分:45)

假设您的课程如下:

class Frob {
    public string Foo { get; set; }
    public int Bar { get; set; }
    public double FooBar { get; set; }
}

假设您定义了等号,以便Frob的两个实例相等,如果FooBar相等,但FooBar无关紧要。

然后,您应该根据GetHashCodeFoo来定义Bar。一种方式是这样的:

return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();

基本上,您只想合并定义相等性的所有字段。一种方法是像我一样继续累积和乘以17。它速度快,简单,正确,通常可以很好地分发。