Rumah > pembangunan bahagian belakang > C++ > Mengapa gelung C# saya menangkap nilai pembolehubah yang salah?

Mengapa gelung C# saya menangkap nilai pembolehubah yang salah?

Susan Sarandon
Lepaskan: 2025-02-03 07:59:09
asal
898 orang telah melayarinya

Why Does My C# Loop Capture the Wrong Variable Value?

Penutup pembolehubah dalam kitaran: Masalah pelik

Apabila menggunakan kitaran C#, anda mungkin menghadapi masalah khas untuk menangkap pembolehubah. Mari kita pertimbangkan adegan berikut:

Berbeza dengan yang dijangkakan, kod ini mencetak lima "10" dan bukannya urutan yang dijangkakan 0, 2, 4, 6, 8.
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

<:> Soalan: Pemboleh ubah tangkapan dalam kitaran

semua fungsi lambda yang dibuat dalam kitaran menangkap pembolehubah yang sama . Oleh itu, apabila fungsi ini dipanggil di luar, mereka semua memetik nilai akhir

.

variable <决> Penyelesaian: Penyelamat Salin variable

Untuk menyelesaikan masalah ini, anda perlu membuat salinan pembolehubah dalam kitaran, dan kemudian menangkapnya dalam setiap fungsi lambda:

Dengan membuat salinan, setiap penutupan yang dibuat dalam kitaran akan menangkap nilai unik

sendiri, dengan itu menghasilkan output yang diharapkan.

while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}
Salin selepas log masuk
Langkah berjaga -jaga

variable

Sila ambil perhatian bahawa teknologi ini juga boleh digunakan untuk kitaran FOR dan Foreach, yang merujuk kepada pembolehubah tunggal dalam pelbagai lelaran. Untuk mengelakkan masalah ini, adalah disyorkan untuk mematuhi kaedah pemprosesan C# 5 pengkompil kitaran foreach, yang memastikan bahawa setiap lelaran mempunyai pemboleh ubah tangkapan sendiri.

Atas ialah kandungan terperinci Mengapa gelung C# saya menangkap nilai pembolehubah yang salah?. 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