Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Mencegah Tingkah Laku Tidak Dijangka Semasa Menangkap Pembolehubah dalam C# Lambda Expressions?
Memahami C# Lambda Expression Variable Capture
Ekspresi lambda C# menawarkan cara padat untuk menentukan fungsi tanpa nama. Walau bagaimanapun, interaksi mereka dengan pembolehubah dalam skop sekeliling boleh menjadi rumit.
Masalahnya: Pengubahsuaian Pembolehubah Dikongsi
Mari kita periksa isu biasa. Kod berikut bertujuan untuk membuat senarai tindakan, setiap satu mencetak nilai pembilang yang berbeza:
<code class="language-csharp">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action a in actions) a();</code>
Anehnya, ini mencetak "10" sepuluh kali. Lambda menangkap rujukan kepada i
, bukan nilainya. Apabila gelung mengubah suai i
, semua lambda melihat nilai akhir.
Penyelesaian: Menangkap Mengikut Nilai
C# tidak secara langsung menyokong sintaks tangkapan demi nilai seperti C 0x [=]
. Penyelesaiannya ialah membuat salinan setempat dalam skop gelung:
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // Create a local copy actions.Add(() => Console.WriteLine(copy)); }</code>
Kini, setiap lambda menangkap pembolehubah copy
yang berasingan, mengekalkan nilai yang betul untuk setiap lelaran.
Mengapa Salinan Tempatan Penting
Perbezaannya terletak pada skop berubah-ubah. Rujukan berkongsi lokasi memori yang sama; perubahan segera dicerminkan. Salinan mencipta petikan bebas bagi nilai pembolehubah pada masa tangkapan. Perubahan seterusnya kepada pembolehubah asal tidak berkaitan dengan salinan tangkapan lambda.
Atas ialah kandungan terperinci Bagaimanakah Saya Mencegah Tingkah Laku Tidak Dijangka Semasa Menangkap Pembolehubah dalam C# Lambda Expressions?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!