Maison >développement back-end >C++ >Pourquoi l'ajout de plusieurs objets à une liste écrase-t-il les entrées précédentes ?

Pourquoi l'ajout de plusieurs objets à une liste écrase-t-il les entrées précédentes ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-19 20:18:17237parcourir

Why Does Adding Multiple Objects to a List Overwrite Previous Entries?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn