Pourquoi implémenter "GetHashCode()" quand "Equals()" est surchargé ?

GetHashCode() permet de fournir un clé de hashage qui sera utilisée pour différencier l’objet par rapport à un autre. Par exemple, il sert pour les dictionnaires pour comparer rapidement des objets entre eux. Des objets de même type et ayant les valeurs (de propriétés par exemple) doivent avoir le même hash code.

Tous les composants .NET n’utilisent pas seulement l’opérateur d’égalité pour comparer deux objets entre eux comme les dictionnaires par exemple. Ainsi si on définit l’opérateur d’égalité, il faut aussi redéfinir GetHashCode().

Comment redéfinir GetHashCode() pour une classe ?

Une astuce consiste à utiliser le GetHashCode() des propriétés de la classe. On peut les associer en utilisant l’opérateur "^" ("ou" exclusif bit à bit):

GetHashCode(classe) = prop1.GetHashCode() ^ prop2.GetHashCode() ^ prop3.GetHashCode()… 

On peut alors redéfinir l’opérateur GetHashCode() pour les types de ces propriétés ou l’utiliser tel que pour les types primitifs.

Le type doit être le même: par exemple pour un entier et un long, il faudra "caster" le long en int.

Leave a Reply