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
Barbara Streisandasal
2025-01-19 20:11:09919semak imbas

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>

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!

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