首页 > 后端开发 > C++ > 为什么将项目添加到列表会导致覆盖?

为什么将项目添加到列表会导致覆盖?

Susan Sarandon
发布: 2025-01-19 20:30:14
原创
708 人浏览过

Why Does Adding Items to a List Result in Overwriting?

理解 C# 中的列表覆盖

在 C# 中向 List<T> 添加项目有时会导致意外结果:所有项目最终都与最后添加的项目相同。本文解释了原因以及如何修复它。

让我们看一个简化的场景:

List<Tag> tags = new List<Tag>();
Tag _tag = new Tag(); // Problem: Single instance reused
string[] tagList = new[] { "Foo", "Bar" };

foreach (string t in tagList)
{
    _tag.tagName = t;
    tags.Add(_tag);
}
登录后复制

问题源于循环内重复使用相同的 _tag 实例。每次迭代都会修改同一个对象,导致所有列表条目都保存最终值。

解决方案:每个项目的新实例

正确的方法是为每次循环迭代创建一个新的_tag对象:

foreach (string t in tagList)
{
    Tag _tag = new Tag(); // New instance each time
    _tag.tagName = t;
    tags.Add(_tag);
}
登录后复制

这确保每个列表元素都是一个不同的对象,保留唯一的值。

奖励:结构体的行为

有趣的是,如果 Tag 是一个结构体而不是一个类,则原始代码将正常工作。 这种差异源于类和结构处理内存分配的方式。

类是引用类型;按值传递类仅复制引用,而不复制对象本身。 修改方法内的参数会改变原始对象。 然而,结构是值类型。按值传递结构会创建一个副本。 因此,将 _tag (结构体)添加到列表中会添加一个副本,从而防止覆盖。

以上是为什么将项目添加到列表会导致覆盖?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板