Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menghalang Ungkapan Lambda daripada Menangkap Rujukan dalam C#?
Mencegah Tangkapan Rujukan dalam C# Lambda Expressions
Ekspresi lambda C#, secara lalai, menangkap pembolehubah melalui rujukan. Ini bermakna ungkapan lambda mengekalkan penunjuk kepada pembolehubah asal dan sebarang perubahan pada pembolehubah itu selepas penciptaan lambda akan ditunjukkan apabila lambda dilaksanakan.
Berikut ialah contoh yang menggambarkan tingkah laku ini:
<code class="language-csharp">class Program { delegate void Action(); static void Main(string[] args) { 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>
Melaksanakan kod ini akan mencetak "10" sepuluh kali. Ini berlaku kerana setiap lambda menangkap rujukan kepada pembolehubah tunggal i
, yang nilainya ialah 10 pada masa gelung selesai.
Untuk mengelakkan tangkapan rujukan ini dan memastikan setiap lambda mendapat salinan nilai pembolehubah gelungnya sendiri, buat salinan setempat dalam 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 berbeza, mengekalkan nilai pada masa penciptaannya. Output akan memaparkan nombor 0 hingga 9 dengan betul.
Adalah penting untuk memahami bahawa tidak seperti beberapa bahasa lain (seperti C ), C# tidak menawarkan mekanisme langsung untuk menyatakan rujukan atau tangkapan nilai secara eksplisit dalam sintaks ungkapan lambda itu sendiri. Mencipta salinan tempatan ialah penyelesaian standard untuk mencapai semantik penangkapan nilai.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Ungkapan Lambda daripada Menangkap Rujukan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!