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

Windows Forms Discussion :

.NET C# Egalité entre 2 instances


Sujet :

Windows Forms

  1. #1
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut .NET C# Egalité entre 2 instances
    Salut,

    Je rencontre un petit souci en comparant 2 instances d'une même classe.
    Voilà bien qu'ayant instancié de la même façon, l'utilisation de la méthode Equals me les déclare comme étant différent.

    J'ai l'impression que :
    Object.Equals compare non pas les objets eux-même mais leur référence - je me trompe ?

    Que puis-je faire pour qu'il puisse me dire qu'ils sont pareils.

    Mow

  2. #2
    Membre éclairé Avatar de Davide
    Profil pro
    Inscrit en
    Août 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 80
    Par défaut
    C'est exactement ca..

    Si tu veux tester..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ' vb
    dim o1 as new Object
    dim o2 as Object = oOriginal
     
    // C#
    Object o1 = new Object();
    Object o2 as Object = oOriginal
    Là Object.Equal retournera true..
    Ce n'est pas un equal sur le type mais bien sur la référence..

    En ce qui concerne ta question tout dépend du type de ta classe.. dis en nous un peu plus.. ;-)

  3. #3
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Que dire sur ma classe sinon qu'elle comporte des attributs et des methodes.
    Une particularité l'un de ses attributs est en fait une collection.

    Une idée du code exécuté
    T1 = new Toto();
    T1.findByPrimaryKey(1); // Charge T1 avec les données associées à la PK 1
    T2 = new Toto();
    T2.findByPrimaryKey(1); // Charge T2 avec les données associées à la PK 1

    Pour moi qu'ayant des références différentes T1 est semblable à T2.
    C'est ce que j'aimerais trouver en fait

    Merci,
    Mow

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par Davide
    C'est exactement ca..
    c'est surtout exactement pas ça .

    La méthode Equals permet de comparer 2 instances d'objet à travers son implémentation et particulièrement en utilisant CompareTo. En fonction de l'implémentation ou non de IComparable par les objets à comparer, la méthode Equals va faire une simple comparaison d'instance ou utiliser le retour de la méthode CompareTo.

    Mais cela ne répond pas à ton problème.
    En effet la méthode Equals ne test pas le type d'un objet mais bien la valeur (formé par l'ensemble des valeurs que l'on souhaite prendre en compte afin de décréter qu'un objet est egal à un autre (voir CompareTo).

    Pour faire ce que tu veux faire, il te faut passer par le mot clef is qui lui compare bien le type de chaque objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MaClass obj1 = new MaClass();
    MaClass obj2 = new MaClass();
     
    obj1 == obj2 // => faux si MaClass n'implémente pas IComparable, sinon ça dépend de la façon de comparer.
     
    ((obj1 is MaClass) && (obj2 is MaClass)); // Vrai obj1 et obj2 sont tout deux de type MaClass

  5. #5
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Merci pour ces précieux conseils !

    Effectivement en implémentant l'interface IComparable, je peux mieux comparer 2 instances d'une même classe.
    Renseigner de ce fait la méthode CompareTo ne fait qu'implémenter une procédure de comparaison entre 2 instances de la classe.. ce que j'aurais pu faire sans l'interface IComparable.

    Je n'ai pas essayé sans mais je ne vois pas la vraie valeur de la classe IComparable.
    Dans ma méthode CompareTo en fait je compare les attributs des instances entre eux.

    Merci,
    Mow

  6. #6
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Ce que j'ai voulu c'est que je peux très bien écrire une méthode CompareTo sans obligatoirement implémenter l'interface IComparable.

    Je vois pas ce que cela changera. Allez je vais essayer et voir la différence.

    A tout à l'heure
    Mow

  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Salut .

    La déifférence va venir de la façon dont le framework va réagir à ta classe.

    Si elle implémente IComparable, lors de l'appel à Equals le framework va automatique faire appel à CompareTo afin de déterminer si les instances sont égales.
    Si elle n'implémente pas IComparable, la méthode Equals se base sur les références (pointeurs).

    De plus implémenter IComparable te permet de bénéficier des autres fonctions comme celle de tries par exemple.

    Bref c'est une bien meilleur idée d'implémenter IComparable

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

Discussions similaires

  1. [C++.NET] Egalite entre datatables
    Par raboin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 06/06/2006, 15h59
  2. [VB .Net][Forms] Interaction entre deux forms
    Par plasticgoat dans le forum Windows Forms
    Réponses: 7
    Dernier message: 24/08/2005, 13h14
  3. [VB.NET] ComboBox lien entre deux tables
    Par VDB1 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/07/2004, 12h15
  4. [Débutant] communication entre 2 instances
    Par xiao-long974 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 05/06/2004, 12h07
  5. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24

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