Copie d'objets

Résolu
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006 - 26 févr. 2006 à 16:29
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006 - 26 févr. 2006 à 17:20
Bonjour,

J'ai un petit soucie avec les copies d'objets: Lorsque je copie un objet et que je modifie la copie ca modifie la source egalement.

Concretement:
MonObject Source=new MonObjet;
MonObjet Copie=Source;
Copie.UneFonction();

Si UneFonction modifie l'objet alors Copie sera modifie, evidement, mais egalement Source. Ce qui est tres handicapant. Je me suis dit que ce devait etre une regle inherente au C# - bien qu'etant tout a fait etonne.

J'ai donc resteste avec un objet de base du C#:
string Source = "ACDE";
string Copie= Base;
Copie.Insert(1, "B");

Et, bien entendu, Source vaut "ACDE" à la fin de l'exemple.

Je ne comprends pas pourquoi cela se deroule ainsi avec ma classe utilisateur. Si vous avez une idee sur la question je serai ravi de l'entendre.

Par avance, merci,
Thomas.

6 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 févr. 2006 à 17:08
Salut,

Oula attention.
Ton test n'est pas valide à cause du caractère spécial de la classe String en .Net : elle est immuable, toute opération sur une chaine ne modifie pas la chaine mais retourne une nouvelle instance avec le résultat.
Donc c'est normal que ton test sur string soit valide, jette un coup d'oeil à la doc de String.Insert.

Dans ton code, si MonObject est un type référence (ce qui est la cas de toute classe), quand tu fais :
MonObject Source=new MonObjet();
MonObjet Copie=Source;
tu obtient 2 références, Source et Copie (qui en l'occcurence n'en est pas une), au même objet, celui résultant de new MonObject();, et non pas 2 objets distincts.

Tu devrais implémenter ICloneable sur ta classe et te servir de la méthode Clone que tu auras développée afin d'obtenir une copie réelle de ton objet.

/*
coq
MVP Visual C#
*/
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 févr. 2006 à 17:14
Salut,
En fait en C#, les lignes suivantes

MonObject Source = new MonObjet;
MonObjet Copie = Source;

font simplement pointer la variable "Source" et "Copie" sur le même emplacement mémoire. C'est à dire que si tu modifies l'une ou l'autre variable, tu modifies toutes les références qui pointent sur cet emplacement.
Pour avoir une nouvelle instance (un autre emplacement mémoire) il faut faire un clône (avec la méthode MemberwiseClone() [clonage superficiel]). Si cette méthode n'est pas disponible, alors il faut implémenter la chose soit-même en créant un nouvel object (avec le "new") et en copiant tout le contenu de ton object dans la nouvelle variable.


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
3
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006
26 févr. 2006 à 16:31
Dans mon deuxième exemple, ce n'est pas "string Copie= Base;" mais "string Copie = Source;"
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 févr. 2006 à 17:16
Me suis fait eu... pour changer! (et tjrs par le même )


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 févr. 2006 à 17:17
lol

/*
coq
MVP Visual C#
*/
0
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006
26 févr. 2006 à 17:20
Bonjour a vous deux et merci. Je vais me pencher sur ICloneable.

Bonne journée,
Thomas.
0
Rejoignez-nous