Rumah >pembangunan bahagian belakang >C++ >Mengapa gelung C# saya menangkap nilai pembolehubah yang salah?
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.
<code class="language-csharp">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(); }</code>
<:> 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.
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>Langkah berjaga -jaga
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!