Учитывая то, с чем связан @Mitch Wheat, это не лучший способ сделать GetHashCode (), если вы используете этот класс со словарем или HashSet.
Представьте, что ваш внутренний словарь содержит только одну запись. Ваш хэш теперь является значением этого единственного KeyValuePair
. Вы вставляете весь класс в HashSet
. Вы добавляете еще один элемент к вашему внутреннему Dictionary
. Теперь хэш-код вашего класса изменился, потому что вы перебираете два элемента в своем классе.
Когда вы вызываете HashSet.Contains(obj)
, он вызывает obj.GetHashCode()
, который теперь изменился, даже если это тот же экземпляр класса. HashSet.Contains()
обнаружит, что он не содержит этот новый хеш, и вернет false, никогда не вызывая Equals (который вернет true, если ссылки совпадают).
Внезапно, как будто ваш объект исчез из HashSet, даже если класс находится там, с устаревшим хешем.
Вы действительно не хотите, чтобы ваш хэш изменился. В вашей GetHashCode
нормально иметь коллизии, потому что, если она сталкивается, она вызовет (более медленный) метод .Equals()
. Это удобная оптимизация, которая, если она неправильно реализована, может вызвать некоторые головные боли на этом пути.
В качестве примечания, как указано в ссылке выше, неплохо бы умножить ваш хэш на простое число до ^
с другим значением. Помогает с сохранением уникальности.