Maison >développement back-end >C++ >Pourquoi les éléments de ma liste s'écrasent-ils les uns les autres en 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!