Rumah > pembangunan bahagian belakang > C++ > Mengapa ekspresi C# Lambda dalam gelung menangkap pembolehubah yang sama, dan bagaimanakah ini dapat diselesaikan?

Mengapa ekspresi C# Lambda dalam gelung menangkap pembolehubah yang sama, dan bagaimanakah ini dapat diselesaikan?

Barbara Streisand
Lepaskan: 2025-02-03 07:46:13
asal
295 orang telah melayarinya

Why Do C# Lambda Expressions in Loops Capture the Same Variable, and How Can This Be Resolved?

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 nilai

pembolehubah 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>
Salin selepas log masuk
Daripada output yang diharapkan (0, 2, 4, 6, 8), kod output lima 8s. Ini kerana semua ekspresi Lambda merujuk nilai

akhir (iaitu 10 selepas gelung selesai), bukan nilainya pada masa setiap lambda dicipta. variable

Penyelesaian: Membuat salinan

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>
Salin selepas log masuk
yang berbeza, menghasilkan output yang betul.

copy

Dalam versi C# 5 dan kemudian, tingkah laku gelung

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan