了解新增多個物件時的清單覆蓋
將多個物件新增至清單可能會導致意外行為:所有清單條目最終可能具有與最後新增的物件相同的值。 發生這種情況是因為對單一物件實例的共用參考。
讓我們來看一個例子:
<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中文網其他相關文章!