Rumah >pembangunan bahagian belakang >C++ >Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?
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
<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>, 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.
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
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!