正确实现 GetHashCode

我想听听社区关于我应该如何为我的对象实现 GetHashCode (或者覆盖它)的意见。我知道如果我重写了 equals 方法,就需要这样做。我已经实现了相当多次,有时只是调用基方法。我理解,如果我的对象包含相同的细节(成员) ,那么它应该等于该对象的另一个实例。从类成员获得散列码的最佳方法是什么?

77307 次浏览

假设你的班级是这样的:

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

假设定义了 equals,那么如果 FooBar相等,那么 Frob的两个实例是相等的,但是 FooBar并不重要。

然后你应该用 FooBar来定义 GetHashCode,一种方法是这样的:

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

基本上,您只需要合并定义相等的所有字段。一种方法就是像我一样不断地积累乘以17。它快速,简单,正确,并且它通常会给出一个很好的分布。