Copie d'objets [Résolu]

Signaler
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006
-
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006
-
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

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
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#
*/
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
48
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
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

Dans mon deuxième exemple, ce n'est pas "string Copie= Base;" mais "string Copie = Source;"
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
48
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
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
lol

/*
coq
MVP Visual C#
*/
Messages postés
57
Date d'inscription
vendredi 21 mai 2004
Statut
Membre
Dernière intervention
28 juillet 2006

Bonjour a vous deux et merci. Je vais me pencher sur ICloneable.

Bonne journée,
Thomas.