了解添加多个对象时的列表覆盖
将多个对象添加到列表中可能会导致意外行为:所有列表条目最终可能具有与最后添加的对象相同的值。 发生这种情况是因为对单个对象实例的共享引用。
让我们看一个例子:
<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>
代码在循环外创建一个 Tag
对象 (tag
)。然后循环重复修改此 same 对象并将其添加到列表中。 因此,所有列表条目都指向同一个对象,仅反映最终的 TagName
赋值。
解决方案:在循环内创建新实例
要纠正此问题,请在每次迭代的Tag
循环内创建一个新的对象:
<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>
这确保每个列表条目引用一个唯一的 Tag
对象,该对象具有自己独特的 TagName
.
替代方案:使用结构
C# 中的类是引用类型。 另一方面,结构是值类型。 使用结构体可以避免覆盖问题,因为在添加到列表时会创建结构体的副本。
<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>
这种方法通过利用结构固有的赋值复制行为提供了一种简洁高效的解决方案。 但是,请注意,应谨慎使用结构,并且仅在适合它们所代表的数据时使用。
以上是为什么向列表添加多个对象会覆盖以前的条目?的详细内容。更多信息请关注PHP中文网其他相关文章!