Rumah >pembangunan bahagian belakang >C++ >Kenapa gelung C# dengan pembolehubah yang ditangkap menghasilkan hasil yang tidak dijangka?

Kenapa gelung C# dengan pembolehubah yang ditangkap menghasilkan hasil yang tidak dijangka?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-02-03 08:20:10212semak imbas

Why Do C# Loops with Captured Variables Produce Unexpected Results?

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 salinan

dalam 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

dan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn