Rumah >pembangunan bahagian belakang >C++ >Kenapa gelung C# dengan pembolehubah yang ditangkap menghasilkan hasil yang tidak dijangka?
dalam -depth membincangkan masalah menangkap pembolehubah dalam kitaran C#
Dalam C#, pemaju menghadapi masalah yang menarik apabila menggunakan pembolehubah menangkap dalam lelaran kitaran. Pertimbangkan fragmen kod berikut:
Walaupun output yang diharapkan ialah 0, 2, 4, 6, dan 8, kod itu tidak disangka -sangka mengeluarkan lima 10. Alasan untuk tingkah laku ini ialah pembolehubah yang ditangkap
<code class="language-csharp">List<Action> actions = new List<Action>(); int variable = 0; while (variable < 5) { actions.Add(() => Console.WriteLine(variable * 2)); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>. Semua operasi mengutip contoh yang sama .
variable
menyelesaikan masalah pembolehubah penangkapan variable
Untuk mengatasi had ini dan biarkan setiap operasi mempunyai pembolehubah tangkapan sendiri, C# menyediakan penyelesaian yang mudah:
Dengan membuat salinandalam kitaran, setiap operasi menangkap contoh tunggalnya sendiri, untuk memastikan bahawa perubahan di luar ekspresi Lambda tidak akan menjejaskan nilai tangkapan.
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>situasi biasa lain
variable
variable
Masalah ini juga boleh muncul dalam senario lain yang melibatkan pembolehubah dalam kitaran, seperti
lelaran:
Dalam kedua -dua kes ini, salinan pembolehubah tempatan diperlukan untuk menangkap lelaran kitaran semasa.
for
Kesimpulan foreach
<code class="language-csharp">// For loop for (int i = 0; i < 5; i++) { // ... similar issue ... } // Foreach loop // ... similar issue ...</code>Memahami tingkah laku menangkap pembolehubah dalam kitaran C# adalah penting untuk mengelakkan kemalangan. Penyelesaian yang dibincangkan dalam artikel ini memastikan bahawa setiap operasi mempunyai pembolehubah penangkapan bebas tersendiri, dengan itu mencapai tingkah laku yang boleh diramal dan dijangka.
Atas ialah kandungan terperinci Kenapa gelung C# dengan pembolehubah yang ditangkap menghasilkan hasil yang tidak dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!