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 :

Copie d'objet par valeur, MemberwiseClone et List


Sujet :

C#

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut Copie d'objet par valeur, MemberwiseClone et List
    Bonjour,

    Je viens de me rendre compte d'un gros problème.
    J'ai l'impression que MemberwiseClone marche qu'avec les types primitifs.
    Un exemple.

    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
     
    public class ObjetA
    {
    	public long Id { get; set; }
    	public string Name { get; set; }
    	public List<ObjetB> ObjetBList { get; set; }
     
    	public ObjetA Clone()
    	{
    		return (ObjetA)MemberwiseClone();
    	}
    }
     
    public class ObjetB
    {
     
    }
     
    var obj1 = new ObjetA(){Name = "Test1", .....};
    //obj1.ObjetBList.Count => 5
     
     
    var obj2 = obj1.Clone();
    obj2.Name = "Test2";
    obj2.ObjetBList.Clear();
     
    //obj1 => Test1
    //obj2 => Test2
    //obj1.ObjetBList.Count => 0
    //obj2.ObjetBList.Count => 0

    En fait quand je modifie l'obj1.ObjetBList cela se répercute obj2.ObjetBList et vis versa.
    Hors ce n'est pas le comportement que je souhaite.
    Suis je obligé de parcourir la liste et d'appliquer clone à tous?
    Par avance merci.

  2. #2
    Membre averti
    Profil pro
    Ingenieur étude et développement
    Inscrit en
    Décembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur étude et développement

    Informations forums :
    Inscription : Décembre 2009
    Messages : 29
    Par défaut
    Tu peux instancier ta liste pour ton objetB avec comme paramètre la liste de ton objetA. Dans ce cas il va faire une copie.

    Du côté de MemberwiseClone, il ne permet pas de faire une copie des "sous-objets"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public ObjetA Clone()
    {
       ObjetA objectA = new ObjetA();
       objectA = (ObjetA)this.MemberwiseClone();
       objectA.ObjetBList = new List<ObjetB>(this.ObjetBList);
       return objectA;
    }

  3. #3
    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
    Par défaut
    Citation Envoyé par takinelinfo Voir le message
    J'ai l'impression que MemberwiseClone marche qu'avec les types primitifs.
    Non, c'est pas ça, c'est juste que ça fait une copie "superficielle" (shallow copy). Ca copie les valeurs des champs, donc pour les types valeur (struct) ça marche comme on peut s'y attendre, mais pour les types référence (class), la valeur du champ est une référence, donc ça copie la référence ; ça ne clone pas l'objet pointé par la référence.

    Si tu veux une copie "profonde" de l'objet, il faut l'implémenter toi-même. Pour copier la liste tu peux faire comme indiqué par Aldryl, ou utiliser la méthode d'extension ToList (ça revient au même mais c'est plus concis). Par contre, n'oublie pas que les objets contenus dans la liste ne seront pas clonés : les 2 listes contiendront des références vers les mêmes objets. Là encore, tu peux les cloner manuellement si besoin

Discussions similaires

  1. Passer un objet par valeur et non référence
    Par Pynouz dans le forum C#
    Réponses: 2
    Dernier message: 14/01/2011, 09h42
  2. Passage d'objet par valeur
    Par Ghurdyl dans le forum C++/CLI
    Réponses: 4
    Dernier message: 15/07/2009, 17h08
  3. Envoyer des objets par valeur
    Par Promeneur dans le forum Windows Communication Foundation
    Réponses: 7
    Dernier message: 28/03/2008, 17h45
  4. Copier un objet par valeur ?
    Par Totanne dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/03/2008, 14h22
  5. [POO] Objet par valeur
    Par seb34 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 22h49

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