Rumah >pembangunan bahagian belakang >C++ >Mengapa Menambah Item pada Senarai Menghasilkan Penimpaan?

Mengapa Menambah Item pada Senarai Menghasilkan Penimpaan?

Susan Sarandon
Susan Sarandonasal
2025-01-19 20:30:14646semak imbas

Why Does Adding Items to a List Result in Overwriting?

Memahami Gantian Senarai dalam C#

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn