web-dev-qa-db-fra.com

Remplacement de GetHashCode

Comme vous le savez, GetHashCode renvoie une valeur semi-unique pouvant être utilisée pour identifier une instance d'objet dans une collection. À titre de bonne pratique, il est recommandé de remplacer cette méthode et d’implémenter la vôtre.

Ma question est la suivante: remplacez-vous cette méthode lorsque vous travaillez sur des objets personnalisés? Si oui, quel algorithme utilisez-vous pour générer l'identifiant unique?

Je pensais à générer un GUID puis à récupérer des données entières à partir de cet identificateur.

30
Den Delimarsky

Lorsque vous remplacez GetHashCode(), vous devez également remplacer Equals(), operator== et operator!=. Et soyez très attentif à répondre à toutes les exigences de ces méthodes.

Les instructions sont ici sur MSDN . Citation la plus importante: 

Ce n'est pas une bonne idée de remplacer l'opérateur == dans les types non immuables. 

25
Henk Holterman

Si vous utilisez un programme de réimpression, si possible, générez automatiquement votre code GetHashCode (), est égal à l’opérateur.

Accès au menu de menuAlt+Insert.

http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html

29
Winston

Dans mon utilisation personnelle, je ne remplace que lorsque je substitue également la méthode equals. En règle générale, je le fais pour les objets dont je sais que je pourrais exécuter une requête LINQ to Objects ou une autre opération de comparaison.

Je retourne généralement, si on dit une entité LINQ to SQL ou un objet DTO, la valeur de la clé primaire. Quoi que vous retourniez, si vous ne stockez pas la valeur localement, cela peut produire un résultat inattendu.

HTH.

1
Brian Mains

Je remplacerais normalement les méthodes de contrôle hashcode et d’égalité pour les classes de données (c’est-à-dire les classes pour lesquelles la sémantique de valeur a un sens). Regardez this question pour une implémentation commune. Si vous annulez hashcode, écrasez. L'utilisation d'un GUID est une idée assez terrible car vous voulez que deux objets qui sont des instances différentes mais qui ont le même value aient le même hashcode et for égal à qui retournent la valeur true.

1
brain

vous devez uniquement remplacer GetHashCode si vous substituez Equals. Le code GetHashCode par défaut est implémenté par le moteur d'exécution de la même manière que vous le souhaitiez: chaque objet possède un champ masqué affecté par le moteur d'exécution.

Comment remplacer GetHashCode

En réalité, votre IDE devrait le faire pour vous - lorsque vous tapez "override GetHashCode", le IDE devrait générer ce code passe-partout. Visual Studio ne le fait pas mais SharpDevelop le fait.

0
Martin Konicek