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 :

[C#] Surcharge de l'opérateur ==


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut [C#] Surcharge de l'opérateur ==
    Bonjour à tous !

    Je veux surcharger l'opérateur == pour comparer deux objets de ma classe.

    Voilà comment ma classe définie la surcharge des opérateurs == (et != qui doit aller avec) (méthode surcharge opérateur en gras)

    Code : 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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    
    
    public class RemoteFileInfo : IRemoteFileInfo
    {
    	private string[] _filename = new string[2];
        private string _md5;
        private long _weight;
    
    
        public RemoteFileInfo()
    	{
    		//
    		// TODO*: ajoutez ici la logique du constructeur
    		//
    	}
        public RemoteFileInfo(string completeFilename,long weight,string md5)
        {
    
            _filename = SplitFilenameDirname(completeFilename);
            RemoteFile_Dir = _filename[0];
            RemoteFile_Name = _filename[1];
            RemoteFile_Weight = weight;
            RemoteFile_Md5 = md5;
        }
    
    
    
            private string[] SplitFilenameDirname(string completeFilename)
            {
                string[] result = new string[2];
                char _antislash = '\\';
                int start = completeFilename.LastIndexOf(_antislash) + 1;
                int length = completeFilename.Length - start;
                result[0] = completeFilename.Substring(0,start);
                result[1] = completeFilename.Substring(start,length);
                new Error(new user()).WriteError("tttttt" + result[0] + "\n" + result[1],new Exception());
                return result;
            }
        
    public static bool operator== (RemoteFileInfo rmf1,RemoteFileInfo rmf2)
        {
            bool compare_name,compare_weight,compare_md5;
            compare_name = (string.Compare(rmf1.RemoteFile_Name, rmf2.RemoteFile_Name) == 0) ? true : false;
            compare_weight = (rmf1.RemoteFile_Weight == rmf2.RemoteFile_Weight) ? true : false;
            compare_md5 = (string.Compare(rmf1.RemoteFile_Md5, rmf2.RemoteFile_Md5) == 0) ? true : false;
            return (compare_name && compare_weight && compare_md5);
        }
    
        public static bool operator !=(RemoteFileInfo rmf1, RemoteFileInfo rmf2)
        {
            bool compare_name, compare_weight, compare_md5;
            compare_name = (string.Compare(rmf1.RemoteFile_Name, rmf2.RemoteFile_Name) == 0) ? true : false;
            compare_weight = (rmf1.RemoteFile_Weight == rmf2.RemoteFile_Weight) ? true : false;
            compare_md5 = (string.Compare(rmf1.RemoteFile_Md5, rmf2.RemoteFile_Md5) == 0) ? true : false;
            return !(compare_name && compare_weight && compare_md5);
        }
    
    
        //Accesseurs
    
        public string RemoteFile_Dir
        {
            get { return this._filename[0]; }
            set { this._filename[0] = value; }
        }
        public string RemoteFile_Name
        {
            get { return this._filename[1];}
            set { this._filename[1] = value; }
        }
        public long RemoteFile_Weight
        {
            get { return this._weight; }
            set { this._weight = value; }
        }
        public string RemoteFile_Md5
        {
            get { return this._md5; }
            set { this._md5 = value; }
        }
    
    }
    Mais quand je teste deux objets (dont je sais qu'ils sont identiques) comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
                bool a = (rmf == _U.U_REMOTE_FILE) ? true : false;
                MessageBox.Show(a.toString());
     
    //où rmf et _U.UREMOTE_FILE sont deux instances de RemoteFileInfo()
    J'obtiens toujours false !

    Est-ce qu'il y a une erreur dans les méthode qui surcharge les opérateurs == et != ??
    Est-ce que quand je fais rmf == _U.U_REMOTE_FILE , j'utilise bien le == surchargé ???

    Merci beaucoup pour votre aide !

  2. #2
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Pourquoi tu ne mes pas un breakpoint à l'interieur de la methode == en mode debug, comme tu vois si la methode est deja entrain d'etre appellee ou pas ensuite tu peux verifier laquelle des 3 variables renvoie false .

    A part ca je vois pas d'erreur dans ton code

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Salut Medhi_tn,

    Je viens de tester le code à l'extèrieur sans passer par l'opérateur surchargé et ça fonctionne.
    En fait, l'opérateur surchargé n'est jamais appelé.

    C'est encore une fois mon problème avec les webservices ...

    du côté du serveur, j'ai le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     
        [WebMethod]
        public RemoteFileInfo CheckFile(user u)
        {
            RemoteFileInfo rmf = u.CheckFileIntegrity();
            return rmf ;
        }
    avec la classe RemoteFileInfo que j'ai écrite sur le dernier post (je l'ai réécrite ici)
    Code : 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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
     
    public interface IRemoteFileInfo
    {
        string RemoteFile_Dir { get;}
        string RemoteFile_Name {get;}
        string RemoteFile_Md5 {get;}
        long RemoteFile_Weight {get;}
    }
     
    public class RemoteFileInfo : IRemoteFileInfo
    {
    	private string[] _filename = new string[2];
        private string _md5;
        private long _weight;
     
     
        public RemoteFileInfo()
    	{
    		//
    		// TODO*: ajoutez ici la logique du constructeur
    		//
    	}
        public RemoteFileInfo(string completeFilename,long weight,string md5)
        {
     
            _filename = SplitFilenameDirname(completeFilename);
            RemoteFile_Dir = _filename[0];
            RemoteFile_Name = _filename[1];
            RemoteFile_Weight = weight;
            RemoteFile_Md5 = md5;
        }
     
     
     
            private string[] SplitFilenameDirname(string completeFilename)
            {
                string[] result = new string[2];
                char _antislash = '\\';
                int start = completeFilename.LastIndexOf(_antislash) + 1;
                int length = completeFilename.Length - start;
                result[0] = completeFilename.Substring(0,start);
                result[1] = completeFilename.Substring(start,length);
                new Error(new user()).WriteError("tttttt" + result[0] + "\n" + result[1],new Exception());
                return result;
            }
        public static bool operator== (RemoteFileInfo rmf1,RemoteFileInfo rmf2)
        {
            bool compare_name,compare_weight,compare_md5;
            compare_name = (string.Compare(rmf1.RemoteFile_Name, rmf2.RemoteFile_Name) == 0) ? true : false;
            compare_weight = (rmf1.RemoteFile_Weight == rmf2.RemoteFile_Weight) ? true : false;
            compare_md5 = (string.Compare(rmf1.RemoteFile_Md5, rmf2.RemoteFile_Md5) == 0) ? true : false;
            return (compare_name && compare_weight && compare_md5);
        }
     
        public static bool operator !=(RemoteFileInfo rmf1, RemoteFileInfo rmf2)
        {
            bool compare_name, compare_weight, compare_md5;
            compare_name = (string.Compare(rmf1.RemoteFile_Name, rmf2.RemoteFile_Name) == 0) ? true : false;
            compare_weight = (rmf1.RemoteFile_Weight == rmf2.RemoteFile_Weight) ? true : false;
            compare_md5 = (string.Compare(rmf1.RemoteFile_Md5, rmf2.RemoteFile_Md5) == 0) ? true : false;
            return !(compare_name && compare_weight && compare_md5);
        }
     
        //Accesseurs
     
        public string RemoteFile_Dir
        {
            get { return this._filename[0]; }
            set { this._filename[0] = value; }
        }
        public string RemoteFile_Name
        {
            get { return this._filename[1];}
            set { this._filename[1] = value; }
        }
        public long RemoteFile_Weight
        {
            get { return this._weight; }
            set { this._weight = value; }
        }
        public string RemoteFile_Md5
        {
            get { return this._md5; }
            set { this._md5 = value; }
        }
     
    }
    Et mon client fait ceci, lorsquele tranfert de fichier est terminé, appelle la webmethode CheckFile() qui retourne un objet remoteFileInfo (rmf1) qui contient les infos du fichier qui vient d'être uploader et qui se trouve sur le serveur. Il tente ensuite de le comparer à son remoteFileInfo(rmf2) qui contiennent les informations du fichier avant qu'il l'upload (son fichier en local)

    Voilà ce que le client fait une fois le tranfert de fichier terminé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    com.sga.services.RemoteFileInfo rmf = _ediW.CheckFile(this._U);
    bool a = (rmf == _U.U_REMOTE_FILE) ? true : false;
    MessageBox.Show(a.ToString());
     
     
    //this._U est un objet qui contient les infos de l'utilisateur ainsi qu'un objet RemoteFileInfo (contenant les infos sur le fichier à uploader (fichier local))

    Je pense donc que le "==" de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    bool a = (rmf == _U.U_REMOTE_FILE) ? true : false;
    est un == "normal" ...

    Qu'en penses tu ?
    Comment faire pour que l'opérateur == du client soit accessible depuis mon client ??
    Les webServices me dépassent un peu ...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Je me posais la question des éléments accessibles depuis un service web.

    Je ne sais pas comment l'exprimer ... mais il y a des "choses" qui ne sont pas sérializable en fonction du sérializeur utlisé (xml,soap,binaire).
    Pour les services web, d'après la faq FAQ sur serialisation (merci Olivier Delmotte),

    On a


    -------------------------------------XML-----------SOAP---------Binaire
    "Human Readable"--------------------Oui-------------Oui-----------Non
    Communication avec Mono sous Linux--Oui------------Oui-----------Non
    Sérialisation de types non standards---Non------------Oui-----------Oui
    Sérialisation des éléments privés-------Non------------Oui-----------Oui
    Sérialisation des champs---------------Non-----------Oui------------Oui
    Sérialisation des propriétés-------------Oui-----------Non------------Non
    Utilisation faite plateforme .Net------------------Services Web-----Remoting



    Donc pour les services Web, c'est le serialiseur SOAP qui est utilisé.
    Donc je crois bien que je ne peux pas avoir accès, depuis mon client à l'opérateur surchargé == de ma classe RemoteFileInfo().

    Y ' a t'il un moyen, alors pour m'en sortir ??

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Surcharge de l'opérateur=
    Par Fr3d_ dans le forum C++
    Réponses: 8
    Dernier message: 20/10/2006, 23h56
  3. Réponses: 8
    Dernier message: 29/08/2006, 00h56
  4. Réponses: 6
    Dernier message: 12/07/2006, 15h34
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

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