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 :

initialiser this dans le contructeur


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut initialiser this dans le contructeur
    Bonjour,

    J'ai 1 classe qui contient des champs.
    Je voudrais y integrer 1 contructeur qui aurait 1 seul paramètre du type de la classe afin de pouvoir faire 1 truc du genre this = MonParam;
    ...mais this est en lecture seule...
    je sais que je peut affecter chaque champ manuellement mais il y en a beaucoup et si j'avais pu le faire en 1 ligne...

    merci pour votre aide.

    Ex. pour ceux qui n'auraient pas compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class MaClasse
    {
       public string Champ1;
       public string Champ2;
       ...
     
      public MaClasse(MaClasse pThis)
      {
         this = pThis; // ce que je souhaiterais mais qui plante...
      }
    }

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Tu veux faire un clone?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,
    J'ai l'impression que tu veux faire le clonage de ton objet. si oui, alors essaye d'implémenter l'interface ICloneable.

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    en fait je voudrais integrer 1 méthode de serialisation et 1 de deserialisation à l'interieur de la classe...

    ICloneable ne permet pas à priori de faire un clone de l'intérieur de la classe comme dans mon exemple...

    merci pour votre réponse...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Ton code n'a aucun sens. "this" est une référence à l'objet courant ... normal qu'il soit en lecture. En fait, si on "suppose" que le code que tu as écris pourrait fonctionner, ça reviendrait au même de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaClasse m1 = new MaClasse();
    MaClasse m2 = m1;
    ce qui aurait pour effet de créer une nouvelle référence vers l'objet m1 et en aucun cas de dupliquer ou cloner les champs. Il suffit de réflechir un peu pour comprendre qu'il est impossible de "cloner" un objet adhoc. C'est pourquoi le clonage nécessite l'implémentation de ICloneable qui définit les règles de clonages. Juste pour reprendre ton objet, est-ce que le clonage implique le clonage de l'objet lui-même ou le clonage de l'objet et de tous les objets qui constituent ses propriétés ?

    Je soutiens donc h2s84 : il faut passer par l'interface ICloneable. Après, tu peux te faciliter le travail dans la méthode Clone en utilisant par exemple la reflection etc. et il faut espérer que tous les objets qui constituent les propriétés de ton objet soient également ICloneable ou des structs sinon tu risques d'avoir des effets de bord intéressants...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Ton code n'a aucun sens. "this" est une référence à l'objet courant ... normal qu'il soit en lecture.
    En fait c'est possible d'affecter une valeur à this... mais seulement pour un type valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Foo
    {
        public int x;
        public string y;
     
        public Foo(Foo other)
        {
            this = other;
        }
    }
    Citation Envoyé par Kaidan Voir le message
    Je soutiens donc h2s84 : il faut passer par l'interface ICloneable. Après, tu peux te faciliter le travail dans la méthode Clone en utilisant par exemple la reflection etc. et il faut espérer que tous les objets qui constituent les propriétés de ton objet soient également ICloneable ou des structs sinon tu risques d'avoir des effets de bord intéressants...
    Si les valeurs des champs n'ont pas besoin d'être elles-mêmes clonées, on peut implémenter ICloneable facilement avec la méthode MemberwiseClone :

    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
    public class MaClasse : ICloneable
    {
       public string Champ1;
       public string Champ2;
       ...
     
        public MaClasse Clone()
        {
            ICloneable x = this;
            return (MaClasse)x.Clone();
        }
     
        object ICloneable.Clone()
        {
            return this.MemberwiseClone();
        }   
     
    }

  7. #7
    Membre averti

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 379
    Points
    379
    Par défaut
    Citation Envoyé par bib34690 Voir le message
    en fait je voudrais integrer 1 méthode de serialisation et 1 de deserialisation à l'interieur de la classe...

    ICloneable ne permet pas à priori de faire un clone de l'intérieur de la classe comme dans mon exemple...

    merci pour votre réponse...
    Si tu veux serialiser, tu dois avoir ceci :

    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
     
    [Serializable]
    public class MaClasse : ICloneable
    {
       public string Champ1;
       public string Champ2;
       ...
     
        public MaClasse Clone()
        {
            ICloneable x = this;
            return (MaClasse)x.Clone();
        }
     
        object ICloneable.Clone()
        {
            return this.MemberwiseClone();
        }   
     
    }
    Si, par exemple, tu ne veux pas que le champ2 soit sérialiser (pour quelconque raisons) tu fais :

    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
     
    [Serializable]
    public class MaClasse : ICloneable
    {
       public string Champ1;
       [NonSerialized]public string Champ2;
       ...
     
        public MaClasse Clone()
        {
            ICloneable x = this;
            return (MaClasse)x.Clone();
        }
     
        object ICloneable.Clone()
        {
            return this.MemberwiseClone();
        }   
     
    }
    Par la suite tu peux te faire une méthode de sérialisation et désérialisation en utilisant un flux (fichier binaire, fichier texte, mémoire vive). Tu utilise la méthode serialize de ce flux pour sélialiser et Deserialize pour désérialiser (ouf c difficile c'est mot compliqué !!!)

    N'oublie pas que Deserialize te retourne un Object donc tu doit caster ton type, en occurence MaClasse.

    Je ne crois pas que tu ai besoins d'un constructeur de copie pour faire sa !

  8. #8
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    Merci pour votre aide et pour ces solutions...
    Transformer ma classe en structure est simple et corresponds parfaitement à mes attentes...

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

Discussions similaires

  1. Initialisation Slider dans un dialogue MFC
    Par Remaille dans le forum MFC
    Réponses: 3
    Dernier message: 17/07/2007, 08h38
  2. re-initialiser DHCP dans le reseau
    Par supersoft5 dans le forum Hardware
    Réponses: 1
    Dernier message: 23/05/2007, 20h26
  3. Initialisation HashMap dans interface
    Par vince_grenoblois dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 16/08/2006, 00h30
  4. Réponses: 5
    Dernier message: 12/03/2006, 14h38
  5. Réponses: 3
    Dernier message: 09/02/2006, 09h54

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