正确实现GetHashCode

我想从社区听到我应该如何去实现GetHashCode(或覆盖它)为我的对象。 我知道我需要这样做,如果我重写equals方法。 我已经实现了相当多的时间,有时只是调用基本方法。 我明白,如果对象包含相同的细节(成员),我的对象应该等于该对象的另一个实例。 从类的成员获取哈希代码的最好方法是什么?

假设你的课堂是这样的:

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

假设你定义了等于,如果他们的Foo和他们的Bar是相等的, FooBar两个实例是相等的,但是FooBar并不重要。

那么你应该用FooBar来定义GetHashCode 。 一种方式是这样的:

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

基本上,你只是想要纳入所有定义平等的领域。 一种方法就是像我一样继续积累和增加17。 它速度很快,很简单,它是正确的,它通常会给出一个很好的分布。