Rumah >pembangunan bahagian belakang >C++ >Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?

Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-02-03 07:44:16580semak imbas

Why Do C# Loop Actions Capture the Same Variable, and How Can This Be Avoided?

pembolehubah dalam penangkapan kitaran

Dalam C#, apabila menentukan operasi dalam kitaran, pastikan anda memberi perhatian kepada tingkah laku penangkapan berubah. Secara lalai, semua operasi menangkap pemboleh ubah yang sama, menyebabkan hasil output tidak memenuhi yang diharapkan ketika memanggil.

sila pertimbangkan contoh berikut:

output yang dijangkakan kod ini ialah 0, 2, 4, 6, dan 8. Walau bagaimanapun, output sebenar adalah lima 10. Ini kerana semua operasi mengutip pemboleh ubah yang sama
<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)
{
    act.Invoke();
}</code>
, yang dikemas kini dalam kitaran. Apabila memanggil, semua operasi mempunyai nilai yang sama 10.

variable Untuk mengelakkan masalah ini dan pastikan setiap contoh operasi mempunyai pemboleh ubah tangkapan sendiri, anda perlu menyalin pembolehubah dalam kitaran:

melalui salinan pembolehubah tempatan, setiap operasi menangkap nilai uniknya sendiri, untuk mendapatkan output yang diharapkan 0, 2, 4, 6, 8.
<code class="language-csharp">while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}</code>

Konsep penangkapan pembolehubah ini adalah penting untuk memahami penutupan C#. Apabila menentukan operasi dalam kitaran, pastikan anda mempertimbangkan kitaran hayat pembolehubah dan kebolehaksesannya.

Atas ialah kandungan terperinci Mengapa tindakan gelung C# menangkap pembolehubah yang sama, dan bagaimanakah ini dapat dielakkan?. 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