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>
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>
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>
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!