Rumah > pembangunan bahagian belakang > C++ > Mengapa Item Senarai Saya Mengganti Satu Sama Lain dalam C#?

Mengapa Item Senarai Saya Mengganti Satu Sama Lain dalam C#?

Barbara Streisand
Lepaskan: 2025-01-19 20:11:09
asal
893 orang telah melayarinya

Why are My List Items Overwriting Each Other in C#?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan