Rumah > pembangunan bahagian belakang > C++ > Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?

Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?

Mary-Kate Olsen
Lepaskan: 2025-02-03 07:44:16
asal
621 orang telah melayarinya

Why Do C# Loop Actions Capture the Same Variable, and How Can This Be Avoided?

pembolehubah dalam penangkapan kitaran

Dalam C#, apabila menentukan operasi dalam kitaran, pastikan anda memberi perhatian kepada tingkah laku penangkapan berubah. Secara lalai, semua operasi menangkap pemboleh ubah yang sama, menyebabkan hasil output tidak memenuhi yang diharapkan ketika memanggil.

sila pertimbangkan contoh berikut:

output yang dijangkakan kod ini ialah 0, 2, 4, 6, dan 8. Walau bagaimanapun, output sebenar adalah lima 10. Ini kerana semua operasi mengutip pemboleh ubah yang sama
List<Action> actions = new List<Action>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => Console.WriteLine(variable * 2));
    ++variable;
}

foreach (var act in actions)
{
    act.Invoke();
}
Salin selepas log masuk
, yang dikemas kini dalam kitaran. Apabila memanggil, semua operasi mempunyai nilai yang sama 10.

variable Untuk mengelakkan masalah ini dan pastikan setiap contoh operasi mempunyai pemboleh ubah tangkapan sendiri, anda perlu menyalin pembolehubah dalam kitaran:

melalui salinan pembolehubah tempatan, setiap operasi menangkap nilai uniknya sendiri, untuk mendapatkan output yang diharapkan 0, 2, 4, 6, 8.
while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}
Salin selepas log masuk

Konsep penangkapan pembolehubah ini adalah penting untuk memahami penutupan C#. Apabila menentukan operasi dalam kitaran, pastikan anda mempertimbangkan kitaran hayat pembolehubah dan kebolehaksesannya.

Atas ialah kandungan terperinci Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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