关于c#:正确实现GetHashCode

Implementing GetHashCode correctly

本问题已经有最佳答案,请猛点这里访问。

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


假设你的班级是这样的:

1
2
3
4
5
class Frob {
    public string Foo { get; set; }
    public int Bar { get; set; }
    public double FooBar { get; set; }
}

假设您定义equal s,那么如果它们的FooBar相等,那么Frob的两个实例是相等的,但是FooBar并不重要。

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

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

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