首頁 > 後端開發 > C++ > 為什麼將項目新增到清單會導致覆蓋?

為什麼將項目新增到清單會導致覆蓋?

Susan Sarandon
發布: 2025-01-19 20:30:14
原創
646 人瀏覽過

Why Does Adding Items to a List Result in Overwriting?

理解 C# 中的列表覆蓋

在 C# 中為 List<T> 新增項目有時會導致意外結果:所有項目最終都與最後新增的項目相同。本文解釋了原因以及如何修復它。

讓我們來看一個簡化的場景:

<code class="language-csharp">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);
}</code>
登入後複製

問題源自於循環內重複使用相同的 _tag 實例。每次迭代都會修改同一個對象,導致所有清單條目都保存最終值。

解決方案:每個專案的新實例

正確的方法是為每次循環迭代建立一個新的_tag物件:

<code class="language-csharp">foreach (string t in tagList)
{
    Tag _tag = new Tag(); // New instance each time
    _tag.tagName = t;
    tags.Add(_tag);
}</code>
登入後複製

這確保每個列表元素都是不同的對象,保留唯一的值。

獎勵:結構體的行為

有趣的是,如果 Tag 是一個結構體而不是一個類,則原始程式碼將正常運作。 這種差異源自於類別和結構處理記憶體分配的方式。

類別是引用類型;按值傳遞類別僅複製引用,而不複製物件本身。 修改方法內的參數會改變原始物件。 然而,結構是值類型。按值傳遞結構會建立一個副本。 因此,將 _tag (結構體)新增至清單中會新增副本,從而防止覆蓋。

以上是為什麼將項目新增到清單會導致覆蓋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板