Rumah >pembangunan bahagian belakang >C++ >Mengapakah Menggunakan Pembolehubah Lelaran dalam Ungkapan Lambda Membawa kepada Keputusan Yang Tidak Dijangka?
Memahami Gelagat Tidak Dijangka Pembolehubah Lelaran dalam Ungkapan Lambda
Seorang pembangun baru-baru ini menemui amaran pengkompil mengenai penggunaan pembolehubah lelaran gelung dalam ungkapan lambda. Ini menyerlahkan perangkap biasa yang membawa kepada tingkah laku program yang tidak dijangka. Mari kita terokai sebab perkara ini berlaku.
Pertimbangkan contoh kod ini:
<code class="language-csharp">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action action in actions) { action(); }</code>
Orang mungkin menjangkakan ini akan mencetak nombor 0 hingga 9 secara berurutan. Sebaliknya, ia mencetak "10" sepuluh kali. Ini kerana ungkapan lambda tidak menangkap salinan i
untuk setiap lelaran. Sebaliknya, mereka menangkap rujukan kepada pembolehubah i
. Apabila gelung foreach
dijalankan, gelung telah selesai dan i
memegang nilai akhirnya sebanyak 10. Oleh itu, setiap ungkapan lambda mencetak nilai akhir ini.
Hasil yang tidak dijangka ini menekankan kepentingan untuk mengelakkan corak pengekodan ini. Amaran pengkompil berfungsi sebagai perlindungan penting. Untuk mencapai output berjujukan yang diingini, cipta pembolehubah baharu di dalam gelung dan tetapkan nilai pembolehubah lelaran kepadanya:
<code class="language-csharp">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { int j = i; // Capture a copy of i actions.Add(() => Console.WriteLine(j)); } foreach (Action action in actions) { action(); }</code>
Kod yang disemak ini mencetak 0 hingga 9 dengan betul kerana setiap ungkapan lambda kini menangkap salinan unik dan bebas nilai j
. Perubahan mudah ini memastikan tingkah laku yang diharapkan dan konsisten.
Atas ialah kandungan terperinci Mengapakah Menggunakan Pembolehubah Lelaran dalam Ungkapan Lambda Membawa kepada Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!