Pemahaman Senarai Ganti Apabila Menambah Berbilang Objek
Menambah berbilang objek pada senarai boleh membawa kepada gelagat yang tidak dijangka: semua entri senarai mungkin berakhir dengan nilai yang sama seperti objek terakhir yang ditambahkan. Ini berlaku kerana rujukan dikongsi kepada satu contoh objek.
Mari kita lihat contoh:
<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>
Kod mencipta satu Tag
objek (tag
) di luar gelung. Gelung kemudian berulang kali mengubah suai objek sama ini dan menambahkannya pada senarai. Akibatnya, semua entri senarai menghala ke objek yang sama, hanya mencerminkan tugasan TagName
terakhir.
Penyelesaian: Cipta Kejadian Baharu Dalam Gelung
Untuk membetulkan ini, cipta objek Tag
baharu di dalam gelung untuk setiap lelaran:
<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>
Ini memastikan setiap entri senarai merujuk kepada objek Tag
unik dengan TagName
yang tersendiri.
Alternatif: Menggunakan Struktur
Kelas dalam C# ialah jenis rujukan. Structs, sebaliknya, adalah jenis nilai. Menggunakan struct boleh mengelakkan masalah tulis ganti kerana salinan struct dibuat apabila ditambahkan pada senarai.
<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>
Pendekatan ini menyediakan penyelesaian yang ringkas dan cekap dengan memanfaatkan kelakuan salinan atas tugasan yang wujud bagi struct. Walau bagaimanapun, ambil perhatian bahawa struct harus digunakan dengan bijak dan hanya apabila sesuai untuk data yang diwakilinya.
Atas ialah kandungan terperinci Mengapa Menambah Berbilang Objek pada Senarai Mengganti Entri Sebelumnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!