Forma concisa de combinar hashcodes de campo?
Um deles, se as maneiras de implementar GetHashCode - onde é necessário fazê-lo - são descritas por Jon SkeetAqui. Repetindo seu código:
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;
}
}
Rodar esse código manualmente pode ser propenso a erros e os bugs podem ser sutis / difíceis de detectar (você trocou+
e*
por engano?), pode ser difícil lembrar as regras de combinação para diferentes tipos, e eu não gosto de gastar esforço mental em escrever / rever a mesma coisa repetidas vezes para diferentes campos e classes. Também pode ofuscar um dos detalhes mais importantes (lembrei-me de incluir todos os campos?) Em ruído repetitivo.
Existe uma maneira concisa de combinar hashcodes de campo usando a biblioteca .net?. Obviamente, eu poderia escrever o meu próprio, mas se há algo idiomático / built-in eu prefiro isso.
Por exemplo, em Java (usando o JDK7) eu posso conseguir o seguinte usando:
@Override
public int hashCode()
{
return Objects.hash(field1, field2, field3);
}
Isso realmente ajuda a eliminar erros e se concentrar nos detalhes importantes.
Motivação: me deparei com uma classe C # que requer uma substituiçãoGetHashCode()
, mas a maneira como combinou os hashcodes de seus vários componentes teve alguns erros graves. Uma função de biblioteca para combinar os hashcodes seria útil para evitar tais erros.