首頁 >後端開發 >C++ >為什麼要向清單新增多個物件會覆蓋先前的條目?

為什麼要向清單新增多個物件會覆蓋先前的條目?

Susan Sarandon
Susan Sarandon原創
2025-01-19 20:18:17272瀏覽

Why Does Adding Multiple Objects to a List Overwrite Previous Entries?

了解新增多個物件時的清單覆蓋

將多個物件新增至清單可能會導致意外行為:所有清單條目最終可能具有與最後新增的物件相同的值。 發生這種情況是因為對單一物件實例的共用參考。

讓我們來看一個例子:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn