9
votes

Création de la méthode gethashcode en C #

Quelle est la meilleure façon de créer votre propre méthode gethashcode pour une classe en C #? Supposons que j'ai une classe simple (qui remplace la méthode des égaux), comme suit: xxx pré>

dois-je utiliser le code par défaut de la méthode gethashcode? P>

public override int GetHashCode()
{
   return names.GetHashCode() + values.GetHashCode() ;
}


4 commentaires

Vous ne remplissez pas correctement ici.


En fait, je pense que cela conduira à Stackoverflow.


Non, cela ne déborde pas de la pile. Cependant, cela ne fonctionnera pas non plus.


Il l'a déjà conduit à Stackoverflow.


4 Réponses :


12
votes

system.array ne remplace pas gethascode ou est égal à , ils utilisent donc l'égalité de référence. Par conséquent, vous ne devriez pas les appeler.

Pour mettre en œuvre gethascode , voir Cette question .

à implémenter est égal à , utilisez le séquenceequal méthode d'extension.

EDIT : sur .NET 2.0, vous devrez écrire votre propre version de séquenceequal , comme ceci: xxx < p> Vous pouvez l'écrire pour prendre ienumerable au lieu de ilist , mais ce serait un peu plus lent, car il ne serait pas capable de sortir tôt Si les paramètres ont des tailles différentes.


1 commentaires

Merci pour la réponse excellente et rapide. Existe-t-il une alternative à la séquenceequale qui fonctionne avec .NET Framework 2.0?



2
votes

Il est vraiment important de vous assurer de garder la substitution de .gethashcode () à pas avec des angles ().

Fondamentalement, vous devez vous assurer qu'ils considèrent les mêmes champs afin de ne pas violer la première des trois règles de GetHashCode (de msdn objet.gethashcode () )

Si deux objets comparent comme étant égal, le Méthode gethashcode pour chaque objet doit renvoyer la même valeur. Cependant, Si deux objets ne comparent pas comme égal, les méthodes gethashcode pour le Deux objets n'ont pas à revenir différentes valeurs.

En d'autres termes, vous devez vous assurer que chaque fois que. Particules considère deux instances égales, elles auront également le même .gethashcode ().

Comme mentionné par quelqu'un d'autre ici, Cette question détaille une bonne implémentation. Si vous êtes intéressé, j'ai écrit quelques articles de blog sur l'enquête sur les codes de hash au début de l'année dernière. Vous pouvez trouver mes Ramblings ici (la première entrée de blog que j'ai écrite sur le sujet)


0 commentaires

1
votes

Il y a une bonne discussion sur les problèmes Ici , et la mise à jour la plus récente fait référence au classe abstraite de baseObject fournie par Sharparchitecture.

Si vous voulez quelque chose de plus ad hoc , j'ai constaté que le code que Resharper génère pour des égaux () et gethashcode () va bien.


0 commentaires

0
votes

Si vous utilisez dotnetcore 2.1+, vous pouvez utiliser HASHCODE 'S Méthode associé à toutes les propriétés, il est très facile à utiliser et à efficacité.


0 commentaires