IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

A quoi servent Equals(object obj) et GetHashCode()


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 254
    Par défaut A quoi servent Equals(object obj) et GetHashCode()
    Bonjour,

    A quoi servent les méthodes par défaut Equals(object obj) et GetHashCode() de la classe Object ? En d'autres mots que trouve t-on dans le corps de ces deux méthodes ?


    Dans un même temps je me suis amusé à réaliser le programme suivant :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
     
    namespace ConsoleApplication1
    {
        class MyClass
        {
            private int _value;
     
            public int Value
            {
                get { return _value; }
                set { _value = value; }
            }
     
            public MyClass(int value)
            {
                this._value = value;
            }
     
            public override bool Equals(object obj)
            {
                Debug.WriteLine("Equals(object obj) " + obj.GetType().ToString());
                return base.Equals(obj);
            }
     
            public bool Equals(MyClass obj)
            {
                Debug.WriteLine("Equals(MyClass obj) " + obj.GetType().ToString());
                return this._value == obj.Value;
            }
     
            public override int GetHashCode()
            {
                Debug.WriteLine("GetHashCode()");
                return _value;
            }
        }
     
        class Program
        {
            static void Main(string[] args)
            {
                List<MyClass> list = new List<MyClass>();
                list.Add(new MyClass(1));
                list.Add(new MyClass(2));
                list.Add(new MyClass(3));
                list.Add(new MyClass(4));
                list.Add(new MyClass(5));
     
                MyClass testdata = new MyClass(3);
     
                Debug.WriteLine(list.Contains(testdata).ToString());
            }
        }
    }

    En debug j'ai ceci:

    Equals(object obj) ConsoleApplication1.MyClass
    Equals(object obj) ConsoleApplication1.MyClass
    Equals(object obj) ConsoleApplication1.MyClass
    Equals(object obj) ConsoleApplication1.MyClass
    Equals(object obj) ConsoleApplication1.MyClass
    False
    Donc ma surcharge de la méthode Equals(MyClass obj) est complètement ignorée. Une raison ?

  2. #2
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    à sert à comparer si deux objets sont identiques tout simplement. (la comparaison se faire par valeur et non par référence)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int x = 10;
     
    int y = 10;
     
    Console.WriteLine( x == y);
     
    Console.WriteLine(x.Equals(y));
    ca affiche

    True
    True

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    StringBuilder s1 = new StringBuilder(“Yes”);
     
    StringBuilder s2 = new StringBuilder(“Yes”);
     
    Console.WriteLine(s1 == s2);
     
    Console.WriteLine(s1.Equals(s2));
    ca affiche

    False
    True

    /!\ y a juste une exception avec la classe String.


    et la seconde te retourne un hash (censé etre unique) qui te permet de comparer deux objects et d'être sûr à 99,999999% que ce sont les même objets.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    En d'autres mots que trouve t-on dans le corps de ces deux méthodes ?
    telecharge le code source de C# 3.0. et tu verras ce qu'il y a dedans

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par DranDane Voir le message
    Donc ma surcharge de la méthode Equals(MyClass obj) est complètement ignorée. Une raison ?
    Parce qu'il n'y a pas de résolution dynamique des surcharges de méthodes, et que List.Contains doit faire appel à item.Equals(object ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    f(objet o) { ... }
    f(int i) { ... }
     
     
    int i = 5;
    object bidule = i;
    f(i); // appelle la fonction f(int)
    f(bidule); // appelle la fonction f(object)
    Si tu veux une fonction Equals typé, tu peux utilser l'interface IEquatable, avec par exemple TaClasse : IEquatable<TaClasse>

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 254
    Par défaut
    Youpie ca marche avec l'interface IEquatable. En tout cas j'apprends pas mal de choses ces derniers jours.

    Merci.

    PS: Je ne trouve pas les codes srouces de C# 3.0. Vous trouvez ca où vous ?

    PPS: j'ai trouvé un snippet "equals" qui aide à l'élaboration de la redéfinition de la méthode Equals sauce Microsoft.

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    t'as pas dû chercher plus de 20 secondes

    http://blogs.msdn.com/mitsufu/archiv...ework-net.aspx

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] A quoi servent les réferences entre les tables??
    Par Alain15 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/02/2006, 16h19
  2. A quoi servent les index dans une BDD ?
    Par Melvine dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 25/10/2005, 12h14
  3. [Débutant] A quoi servent xxxx$1.class et xxxx$2.class
    Par sunchai dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/09/2005, 09h39
  4. [CR 10] A quoi servent les Templates Fields ?
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 10/11/2004, 10h52
  5. [C#] A quoi servent les interfaces???
    Par sof_nns dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/10/2004, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo