Nilai objek senarai C# ditimpa: isu semantik rujukan
Mengapakah semua item dalam senarai menimpa nilai sebelumnya apabila menambah nilai baharu pada senarai? Tingkah laku yang membingungkan ini berpunca daripada struktur data asas dan semantik rujukan dalam C#.
Fahami semantik kelas dan struktur
Dalam C#, kelas ialah jenis rujukan, yang bermaksud pembolehubah jenis kelas menyimpan rujukan kepada lokasi objek sebenar dalam ingatan. Sebaliknya, struktur ialah jenis nilai, dan pembolehubah secara langsung memegang data sebenar.
Dalam coretan kod yang disediakan:
<code class="language-csharp">List<Tag> tags = new List<Tag>(); Tag _tag = new Tag(); string[] tagList = new[] { "Foo", "Bar" }; foreach (string t in tagList) { _tag.tagName = t; // 设置所有属性 tags.Add(_tag); // 覆盖之前的数值 }</code>
Memandangkan _tag
ialah jenis rujukan, operasi tags.Add(_tag)
menambah rujukan kepada objek yang sama pada senarai. Akibatnya, semua elemen dalam senarai sebenarnya menunjuk kepada contoh yang sama. Mengubah suai tika melalui _tag
akan menukar semua item dalam senarai.
Selesaikan masalah dengan mencipta contoh baharu
Untuk mengelakkan tiruan, tika Tag
baharu harus dibuat untuk setiap lelaran gelung:
<code class="language-csharp">foreach (string t in tagList) { Tag _tag = new Tag(); // 为每次迭代创建一个新实例 _tag.tagName = t; tags.Add(_tag); }</code>
Kini, setiap lelaran mencipta contoh Tag
baharu, memastikan setiap objek dalam senarai mempunyai nilai uniknya sendiri.
Nota Tambahan: Struktur dan Kelas
Menggunakan struct dan bukannya kelas menghapuskan isu overwriting kerana struct ialah jenis nilai. Apabila struktur ditugaskan kepada pembolehubah baharu, ia mencipta contoh baharu sepenuhnya yang mengandungi set nilainya sendiri. Oleh itu, tags.Add(_tag)
melakukan operasi penyalinan dan tidak menjejaskan item yang ditambahkan sebelum ini.
Ringkasnya, memahami semantik rujukan dan perbezaan antara kelas dan struct adalah penting untuk mengelakkan masalah menulis ganti dalam senarai objek dalam C#.
Atas ialah kandungan terperinci Mengapa Item Senarai Saya Mengganti Satu Sama Lain dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!