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(); }
<:> 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 uniksendiri, dengan itu menghasilkan output yang diharapkan.
while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }
variable
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!