Rumah >pembangunan bahagian belakang >C++ >Mengapa Menambah Item pada Senarai Menghasilkan Penimpaan?
Menambah item pada List<T>
dalam C# kadangkala boleh membawa kepada hasil yang tidak dijangka: semua item berakhir sama dengan yang terakhir ditambahkan. Artikel ini menerangkan sebab dan cara membetulkannya.
Mari kita periksa senario yang dipermudahkan:
<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>
Isu ini berpunca daripada menggunakan semula contoh _tag
yang sama dalam gelung. Setiap lelaran mengubah suai objek yang sama, menyebabkan semua entri senarai memegang nilai akhir.
Penyelesaian: Contoh Baharu untuk Setiap Item
Pendekatan yang betul ialah mencipta objek _tag
baharu untuk setiap lelaran gelung:
<code class="language-csharp">foreach (string t in tagList) { Tag _tag = new Tag(); // New instance each time _tag.tagName = t; tags.Add(_tag); }</code>
Ini memastikan setiap elemen senarai ialah objek yang berbeza, mengekalkan nilai unik.
Bonus: Gelagat Struktur
Menariknya, jika Tag
ialah struct dan bukannya kelas, kod asal akan berfungsi dengan betul. Perbezaan ini timbul daripada cara kelas dan struct mengendalikan peruntukan memori.
Kelas ialah jenis rujukan; lulus kelas dengan nilai hanya menyalin rujukan, bukan objek itu sendiri. Mengubah suai parameter dalam kaedah mengubah objek asal. Struktur, bagaimanapun, adalah jenis nilai. Melepasi struct mengikut nilai mencipta salinan. Oleh itu, menambah _tag
(struktur) pada senarai menambah salinan, menghalang timpa ganti.
Atas ialah kandungan terperinci Mengapa Menambah Item pada Senarai Menghasilkan Penimpaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!