Краткий способ объединить хэш-коды поля?
Один из них, если Jon Skeet обрисовал способы реализации GetHashCode, где это требуетсяВот, Повторяя его код:
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}
Роллинг этого кода вручную может быть подвержен ошибкам, а ошибки могут быть тонкими / трудно обнаружить (вы поменялись местами+
а также*
по ошибке?), может быть трудно запомнить правила комбинирования для разных типов, и мне не нравится тратить умственные усилия на написание / просмотр одного и того же снова и снова для разных полей и классов. Это также может запутать одну из самых важных деталей (я помню, чтобы включить все поля?) В повторяющийся шум.
Есть ли краткий способ объединить хеш-коды полей с помощью библиотеки .net?, Очевидно, я мог бы написать свой, но если есть что-то идиоматическое / встроенное, я бы предпочел это.
Как пример, в Java (с использованием JDK7) я могу достичь вышеупомянутого, используя:
@Override
public int hashCode()
{
return Objects.hash(field1, field2, field3);
}
Это действительно помогает устранить ошибки и сосредоточиться на важных деталях.
Мотивация: я наткнулся на класс C #, который требует переопределенияGetHashCode()
, но способ, которым он объединил хэш-коды своих различных составляющих, имел некоторые серьезные ошибки. Библиотечная функция для объединения хеш-кодов была бы полезна для избежания таких ошибок.