Maison >développement back-end >C++ >Pourquoi les éléments de ma liste s'écrasent-ils les uns les autres en C# ?

Pourquoi les éléments de ma liste s'écrasent-ils les uns les autres en C# ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-19 20:11:09890parcourir

Why are My List Items Overwriting Each Other in C#?

La valeur de l'objet de liste C# est écrasée : problème sémantique de référence

Pourquoi tous les éléments de la liste écrasent-ils les valeurs précédentes lors de l'ajout d'une nouvelle valeur à la liste ? Ce comportement déroutant provient des structures de données sous-jacentes et de la sémantique de référence en C#.

Comprendre la sémantique des classes et des structures

En C#, les classes sont des types référence, ce qui signifie que les variables de type classe stockent une référence à l'emplacement réel de l'objet en mémoire. D’un autre côté, les structures sont des types valeur et les variables contiennent directement les données réelles.

Dans l'extrait de code fourni :

<code class="language-csharp">List<Tag> tags = new List<Tag>();
Tag _tag = new Tag();
string[] tagList = new[] { "Foo", "Bar" };

foreach (string t in tagList)
{
    _tag.tagName = t; // 设置所有属性
    tags.Add(_tag);  // 覆盖之前的数值
}</code>

Puisque _tag est un type référence, l'opération tags.Add(_tag) ajoute une référence au même objet à la liste. Par conséquent, tous les éléments de la liste pointent en réalité vers la même instance. Modifier une instance via _tag modifiera tous les éléments de la liste.

Résolvez le problème en créant une nouvelle instance

Pour éviter l'écrasement, une nouvelle Tag instance doit être créée pour chaque itération de la boucle :

<code class="language-csharp">foreach (string t in tagList)
{
    Tag _tag = new Tag(); // 为每次迭代创建一个新实例

    _tag.tagName = t;
    tags.Add(_tag);
}</code>

Maintenant, chaque itération crée une nouvelle Tag instance, garantissant que chaque objet de la liste a sa propre valeur unique.

Remarque supplémentaire : structures et classes

L'utilisation de structures au lieu de classes élimine les problèmes d'écrasement car les structures sont des types valeur. Lorsqu'une structure est affectée à une nouvelle variable, elle crée une toute nouvelle instance contenant son propre ensemble de valeurs. Par conséquent, tags.Add(_tag) effectue une opération de copie et n'affecte pas les éléments précédemment ajoutés.

En résumé, comprendre la sémantique des références et la différence entre les classes et les structures est crucial pour éviter les problèmes d'écrasement dans les listes d'objets en C#.

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