Quel est l'importance de "Equals" et "GetHashCode"

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Yazza
Messages : 31
Inscription : 21 Avr 2015 10:45
Localisation : Paris

Quel est l'importance de "Equals" et "GetHashCode"

Message par Yazza » 06 Août 2015 21:08

Bonjour ou Bonsoir, avec Internet on ne sait plus.

Je débarque avec ma question de débutant.
Je me suis retrouvé à créer une classe qui n'hérite d'aucune classe Unity, et j'ai eu besoin de créer les méthodes static pour les opérations +, -, ==, !=, >, <, >= et <= ainsi que de "surcharger" (si c'est bien comme ça que l'on dit) ToString()

Cela marche comme je souhaitais, mais Unity me met en garde :
...defines operator == or operator != but does not override Object.GetHashCode()
...defines operator == or operator != but does not override Object.Equals(object o)
J'aimerai comprendre quel intérêt je gagne à surcharger ces deux fonctions ?
Mon égalité je l'ai avec mon opérateur static ==, a quoi sert le Equals ?
Le GetHashCode me servira dans quel cas ?

Merci d'avance à tous !

Bisous
Je me contredis toujours, voire jamais.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] Quel est l'importance de "Equals" et "GetHashCode"

Message par artemisart » 07 Août 2015 01:13

Le compiler te sort ces warnings parce que c'est standard, et certains codes peuvent s'appuyer sur ces conventions (ex un hashset générique va foirer si tu implémente pas equals, alors que pour le dev c'est pas logique vu que == fonctionne).

L'opérateur == peut être utilisé pour une égalité "de contenu" ou de ref (même pointeurs quoi), Equals est (doit être) pour le contenu.
En pratique == et Equals vérifient l'équivalence (de contenu) pour les struct, alors que == vérifie la ref pour les classes : exactement le même objet, et Equals idem sauf s'il est implémenté (et donc c'est surement pour check le contenu).
GetHashCode ça sert à retourner le hash d'un objet, c'est utile principalement pour optimiser les dico, les sets, etc ou on compare les hash avant de tester avec Equals (sauf s'ils sont mal implémentés ^^), le seul truc à faire gaffe est d'avoir absolument a.GetHashCode() == b.GetHashCode() si a.Equals(b) et de minimiser au max les collisions (a.GetHashCode() == b.GetHashCode() alors que !a.Equals(b), c'est pas top mais ça arrive).

Si tu as eu besoin d'implémenter toutes ces opérations standard, ta classe serait peut-être mieux en struct non ? et c'est toujours bien d'implémenter IEquatable et IComparable !

PS : http://www.dotnetperls.com/ ça peut être utile ;-)

Avatar de l’utilisateur
Yazza
Messages : 31
Inscription : 21 Avr 2015 10:45
Localisation : Paris

Re: [C#] Quel est l'importance de "Equals" et "GetHashCode"

Message par Yazza » 07 Août 2015 06:57

Merci pour la réponse ça m'eclair un petit peu !

Je n'ai jamais utilisé les structures, mais ça me semble bien adapté car ma fonction représente une date (du calendrier) avec jour, mois et année.

J'imagine que je serais un peu plus limité qu'avec une classe ? Qu'est-ce que je ne pourrais pas faire a part ne pas pouvoir hériter ?

[EDIT :
Ton lien explique plutot bien, merci ! :)
http://www.dotnetperls.com/struct
Ca m'a permis aussi de découvrir https://msdn.microsoft.com/fr-fr/librar ... .110).aspx]
Je me contredis toujours, voire jamais.

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: [C#] Quel est l'importance de "Equals" et "GetHashCode"

Message par cayou66 » 07 Août 2015 15:18

Je me sert de classe Serializable pour les afficher dans un inspecteur au travers d'un Monobehaviour et d'une liste. Très pratique quand tu veux remplir des structures de données dans l'éditeur.

Répondre

Revenir vers « Scripting »