C#: Lors de l'ajout de la même objet à deux Liste<object> variables, est l'objet cloné dans le processus?
J'ai quelque chose de similaire à ceci:
//Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();
...
SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);
...
list1[indexOfSomething] = new SomeType("SomeOtherName");
Et de l'objet dans la liste 2 n'est pas changé... c'Est que le résultat attendu?
OriginalL'auteur Austin Hanson | 2009-06-05
Vous devez vous connecter pour publier un commentaire.
Oui, mais rien n'est cloné. Avant la cession, le même objet est dans les deux listes. Après la mission, vous avez deux objets uniques dans les deux listes.
Ce Faire:
et de l'objet dans
list2
va changer, trop.Le "intelligent" pourrait avoir certains wrapper type qui implémente l'interface et les délégués à un membre qui met en œuvre la même interface. Mettre le papier d'emballage dans les deux listes, et puis vous pouvez mettre à jour l'objet que le wrapper tient en un seul endroit et les deux listes d'obtenir la mise à jour.
OriginalL'auteur Can Berk Güder
Rappelez-vous, lorsque vous ajoutez un objet à une liste, vous êtes vraiment juste l'ajout d'un pointeur vers l'objet. Dans ce cas, list1 et list2 pointent vers la même adresse mémoire.
Maintenant que vous avez attribué l'élément de liste1 à un autre pointeur.
Vous n'êtes pas vraiment le clonage des objets eux-mêmes, vous copiez les pointeurs qui vient d'arriver à être pointent vers le même objet. Si vous avez besoin de preuves, procédez de la manière suivante:
areEqual
doit être vrai. Les pointeurs de rock!OriginalL'auteur Juliet
Vous n'êtes pas le clonage de l'objet; vous ajoutez une référence à l'objet même dans les deux listes. Cependant, votre code remplace la référence dans l'une des listes avec une référence à un autre objet, alors oui, c'est le comportement attendu.
OriginalL'auteur Fredrik Mörk
Vous êtes le remplacement de la référence dans une seule liste, avec une référence à un objet. Si vous étiez à la place de modifier une propriété de cet objet, vous pouvez voir qu'il a changé dans les deux endroits, étant donné que la référence restera la même.
OriginalL'auteur Jon B
Oui, vous n'êtes pas le clonage de l'objet. L'objet est ajouté aux deux listes à l'origine par référence, et puis par la suite, vous êtes affecté une référence dans la liste pour le nouvel objet que vous êtes en train de créer.
C'est vraiment le résultat attendu.
OriginalL'auteur Joseph
Quand vous passez le "quelque chose" de l'objet à Ajouter que vous êtes de passage par valeur (c# par défaut), et non par référence
OriginalL'auteur Jon Erickson
Oui, c'est prévu. Seule la référence à l'objet est ajouté. Pas la référence elle-même ou d'une copie.
OriginalL'auteur JaredPar