Rumah >pembangunan bahagian belakang >C++ >Mengapakah Menggunakan Pembolehubah Lelaran dalam Ungkapan Lambda Membawa kepada Keputusan Yang Tidak Dijangka?

Mengapakah Menggunakan Pembolehubah Lelaran dalam Ungkapan Lambda Membawa kepada Keputusan Yang Tidak Dijangka?

Patricia Arquette
Patricia Arquetteasal
2025-01-14 07:51:50488semak imbas

Why Does Using Iteration Variables in Lambda Expressions Lead to Unexpected Results?

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!

Kenyataan:
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