2012-01-25 3 views
45

Я хотел бы услышать от сообщества, как мне следует реализовать GetHashCode (или переопределить его) для моего объекта. Я понимаю, что мне нужно сделать это, если я переопределю метод equals. Я реализовал его довольно много раз, иногда просто называя базовый метод. Я понимаю, что мой объект должен равняться другому экземпляру объекта, если он содержит одни и те же детали (члены). Каков наилучший способ получить хэш-код от членов класса?Правильный ввод GetHashCode

+2

Рассмотрите возможность закрытия как дубликат http://stackoverflow.com/a/720282/93922 –

+2

Прежде чем это сделать, я рекомендую вам прочитать и понять мою статью: http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

+0

Спасибо, я понимаю, что это может быть общий вопрос, и я должен был сделать немного больше охоты вокруг. Спасибо за вашу помощь – Zivka

ответ

34

Допустим, что ваш класс выглядит следующим образом:

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

Допустим, вы определяете равно, так что два экземпляра Frob равны, если их Foo и их Bar равны, но FooBar не имеет значения.

Затем вы должны определить GetHashCode с точки зрения Foo и Bar. Один из способов заключается в следующем:

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

В принципе, вы просто хотите включить все поля, которые входят в определение равенства. Один из способов - просто продолжать накапливать и умножать на 17, как я сделал. Это быстро, это просто, это правильно, и это обычно дает хорошее распространение.

+5

У меня такое чувство, что это должен быть вопрос сам, но почему 23? –

+1

Основной фактор, чтобы сделать {2,1} и {1,2}, отличаются. –

+6

может указывать на то, что GetHashCode сообщает только, что два объекта ** могут считаться равными. По-прежнему существует вероятность столкновения хэшей. – geofftnz

Смежные вопросы