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 :

Copier un objet sans utiliser Clone()


Sujet :

C#

  1. #1
    Membre actif
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut Copier un objet sans utiliser Clone()
    Bonjour,

    Je cherche à copier un objet sans utiliser l'interface ICloneable.
    Mon objet contient une multitude d'objet qui eux, n'ont pas cette interface et je n'ai pas la possibilité de les modifier.

    J'ai essayé MemberwiseClone mais cela ne fonctionne pas (les sous objets sont passés par référence)
    J'ai essayé avec une struct mais idem.

    Certains m'ont parlé de sérialiser et dé-sérialiser l'objet mais avec un impact important sur les performances.

    En C++, faire un new créait systématiquement un nouvel emplacement mémoire, ce n'est apparemment pas le cas en C#

    Pouvez-vous m'aider ?

    Merci.


    Exemple de code :

    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
     
    public class Toto
    {
      public Tata a;
      public Titi b;
     
      public Toto(Tata a, Titi b)
      {
        this.a = a;
        this.b = b;
      }
     
      public Toto(Toto toto)
      {
        a = toto.a;
        b = toto.b;
      }
    }
     
    //main :
    Toto t1 = new Toto(new Tata(), new Titi());
    Toto t2 = new Toto(t1);
     
    t2.a = new Tata();
     
    Console.Write(t1.a.ToString());
     
    //et là, misère, t1.a = t2.a...

  2. #2
    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
    Salut,
    ICloneable ne sert à rien : ça ne fait que t'obliger à déclarer une méthode object Clone(), mais c'est tout. Ca ne dit rien sur la façon dont le clone se fera (copie profonde, superficielle, copie des événements, etc.)

    Tu as fait un constructeur par copie pour Toto ; fais de même pour Tata et Titi.

    Hormis le trick de la sérialisation / désérilaisation, il est impossible de Cloner de l'extérieur un objet.

  3. #3
    Membre actif
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Entendu pour Clone, je vais retirer mes déboires la dessus dans mon code alors

    En ce qui concerne le constructeur par copie, c'est justement mon problème.

    Ici, ce n'était qu'un exemple mais mon objet contient environ une dizaine d'objets qui contiennent également des objet dont certains sont des objet créés automatiquement par EasyObject à partir d'une table. Ces objets EasyObject ne comportent pas de constructeur par copie et je n'ai pas le droit de les modifier (ils ne m'appartiennent pas).

    ça devient compliqué du coup :o

    N'est-t'il pas tout simplement possible de dire dans le code que je veux reprendre cet objet et le recopier à un autre emplacement mémoire, avec un autre nom ?
    Je trouve ça dommage que ça ne soit pas possible...

    Mon but ici étant que mon objet doit avoir des paramètres différents pour pouvoir faire un traitement fictif dessus puis retourner à son état initial. Je réfléchis mais peut-être que deux méthodes save() et restore() feraient également l'affaire (mais je sens que je vais encore avoir ces problèmes d'adresse mémoire)

  4. #4
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    Citation Envoyé par celes Voir le message
    Mon but ici étant que mon objet doit avoir des paramètres différents pour pouvoir faire un traitement fictif dessus puis retourner à son état initial. Je réfléchis mais peut-être que deux méthodes save() et restore() feraient également l'affaire (mais je sens que je vais encore avoir ces problèmes d'adresse mémoire)
    Peut-être que tu pourrais adopter une stratégie différente et utiliser le pattern Undo/Redo pour mettre à jour tes objets.

Discussions similaires

  1. serialiser un objet sans utiliser de bibliothèque externe
    Par Jérémy Lefevre dans le forum Langage
    Réponses: 2
    Dernier message: 11/04/2014, 17h02
  2. Copier une image SANS utiliser le presse-papier
    Par MisterLo dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 18/11/2011, 16h36
  3. Réponses: 2
    Dernier message: 30/08/2011, 23h40
  4. Réponses: 14
    Dernier message: 26/04/2011, 18h00
  5. Objet dans objet sans le copier
    Par 23-UNIT dans le forum Langage
    Réponses: 8
    Dernier message: 03/12/2008, 17h36

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