Não é necessariamente importante; isso depende do tamanho das suas coleções e dos seus requisitos de desempenho e se sua classe será usada em uma biblioteca na qual você talvez não conheça os requisitos de desempenho. Sei com frequência que meus tamanhos de coleção não são muito grandes e meu tempo é mais valioso do que alguns microssegundos de desempenho obtidos com a criação de um código hash perfeito; então (para me livrar do aviso irritante do compilador) eu simplesmente uso:
public override int GetHashCode()
{
return base.GetHashCode();
}
(É claro que eu poderia usar um #pragma para desativar o aviso também, mas prefiro assim.)
Quando você está na posição que você não precisa do desempenho de todas as questões mencionadas por outros aqui se aplicam, naturalmente. Mais importante - caso contrário, você obterá resultados incorretos ao recuperar itens de um conjunto de hash ou dicionário: o código de hash não deve variar com o tempo de vida de um objeto (mais precisamente, durante o tempo em que o código de hash é necessário, como durante a uma chave em um dicionário): por exemplo, o seguinte está errado, pois Value é público e, portanto, pode ser alterado externamente para a classe durante o tempo de vida da instância, portanto, você não deve usá-lo como base para o código de hash:
class A
{
public int Value;
public override int GetHashCode()
{
return Value.GetHashCode(); //WRONG! Value is not constant during the instance's life time
}
}
Por outro lado, se o Valor não puder ser alterado, você poderá usar:
class A
{
public readonly int Value;
public override int GetHashCode()
{
return Value.GetHashCode(); //OK Value is read-only and can't be changed during the instance's life time
}
}