Memahami C# Lambda Expression Capture in Loops dan penyelesaiannya
C# Lambda Ekspresi dalam gelung mempamerkan perangkap yang sama: mereka menangkap pembolehubah yang sama, yang membawa kepada hasil yang tidak dijangka. Ini berlaku kerana ekspresi lambda tidak menangkap nilaipembolehubah pada masa penciptaannya, tetapi sebaliknya rujukan kepada pembolehubah itu sendiri. Pertimbangkan contoh ini:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
akhir (iaitu 10 selepas gelung selesai), bukan nilainya pada masa setiap lambda dicipta.
variable
Untuk menyelesaikannya, buat salinan pembolehubah gelung dalam setiap lelaran:
Sekarang, setiap ungkapan lambda menangkap pembolehubah
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { int copy = variable; // Create a copy actions.Add(() => copy * 2); ++variable; }</code>
copy
telah berubah untuk menangani isu ini. Penyusun menggunakan "Peruntukan Penutupan Pembolehubah Sementara" (CATVS) untuk membuat pembolehubah berasingan secara automatik untuk setiap lelaran, menghapuskan keperluan untuk salinan manual. Penyederhanaan ini menjadikan kod lebih bersih dan lebih mudah dibaca. Walau bagaimanapun, contoh gelung masih memerlukan salinan eksplisit.
Atas ialah kandungan terperinci Mengapa ekspresi C# Lambda dalam gelung menangkap pembolehubah yang sama, dan bagaimanakah ini dapat diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!