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