Rumah >pembangunan bahagian belakang >C++ >Mengapa Menambah Berbilang Objek pada Senarai Mengganti Entri Sebelumnya?

Mengapa Menambah Berbilang Objek pada Senarai Mengganti Entri Sebelumnya?

Susan Sarandon
Susan Sarandonasal
2025-01-19 20:18:17305semak imbas

Why Does Adding Multiple Objects to a List Overwrite Previous Entries?

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!

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