Maison >développement back-end >C++ >Pourquoi l'ajout de plusieurs objets à une liste écrase-t-il les entrées précédentes ?
Comprendre les écrasements de liste lors de l'ajout de plusieurs objets
L'ajout de plusieurs objets à une liste peut entraîner un comportement inattendu : toutes les entrées de la liste peuvent se retrouver avec la même valeur que le dernier objet ajouté. Cela se produit en raison d'une référence partagée à une seule instance d'objet.
Regardons un exemple :
<code class="language-csharp">public class Tag { public string TagName { get; set; } } List<Tag> tags = new List<Tag>(); Tag tag = new Tag(); // This is the problem! string[] tagList = new[] { "Foo", "Bar" }; foreach (string t in tagList) { tag.TagName = t; tags.Add(tag); }</code>
Le code crée un Tag
objet (tag
) en dehors de la boucle. La boucle modifie ensuite à plusieurs reprises ce même objet et l'ajoute à la liste. Par conséquent, toutes les entrées de la liste pointent vers le même objet, reflétant uniquement l'affectation TagName
finale.
La solution : créer de nouvelles instances dans la boucle
Pour corriger cela, créez un nouvel Tag
objet à l'intérieur de la boucle pour chaque itération :
<code class="language-csharp">foreach (string t in tagList) { Tag tag = new Tag(); // Create a new instance each time tag.TagName = t; tags.Add(tag); }</code>
Cela garantit que chaque entrée de liste fait référence à un objet Tag
unique avec son propre TagName
distinct.
Alternative : utiliser des structures
Les classes en C# sont des types de référence. Les structures, en revanche, sont des types valeur. L'utilisation d'une structure peut éviter le problème d'écrasement car une copie de la structure est créée lorsqu'elle est ajoutée à la liste.
<code class="language-csharp">public struct Tag { public string TagName { get; set; } } List<Tag> tags = new List<Tag>(); foreach (string t in tagList) { Tag tag = new Tag { TagName = t }; //Creates a new instance each time tags.Add(tag); }</code>
Cette approche fournit une solution concise et efficace en tirant parti du comportement inhérent de copie sur affectation des structures. Cependant, notez que les structures doivent être utilisées judicieusement et uniquement lorsque cela est approprié pour les données qu'elles représentent.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!