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.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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.