Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Mencegah Tingkah Laku Tidak Dijangka Semasa Menangkap Pembolehubah dalam C# Lambda Expressions?

Bagaimanakah Saya Mencegah Tingkah Laku Tidak Dijangka Semasa Menangkap Pembolehubah dalam C# Lambda Expressions?

Barbara Streisand
Lepaskan: 2025-01-19 00:06:13
asal
188 orang telah melayarinya

How Do I Prevent Unexpected Behavior When Capturing Variables in C# Lambda Expressions?

Memahami C# Lambda Expression Variable Capture

Ekspresi lambda C# menawarkan cara padat untuk menentukan fungsi tanpa nama. Walau bagaimanapun, interaksi mereka dengan pembolehubah dalam skop sekeliling boleh menjadi rumit.

Masalahnya: Pengubahsuaian Pembolehubah Dikongsi

Mari kita periksa isu biasa. Kod berikut bertujuan untuk membuat senarai tindakan, setiap satu mencetak nilai pembilang yang berbeza:

<code class="language-csharp">List<Action> actions = new List<Action>();

for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action a in actions)
    a();</code>
Salin selepas log masuk

Anehnya, ini mencetak "10" sepuluh kali. Lambda menangkap rujukan kepada i, bukan nilainya. Apabila gelung mengubah suai i, semua lambda melihat nilai akhir.

Penyelesaian: Menangkap Mengikut Nilai

C# tidak secara langsung menyokong sintaks tangkapan demi nilai seperti C 0x [=]. Penyelesaiannya ialah membuat salinan setempat dalam skop gelung:

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i; // Create a local copy
    actions.Add(() => Console.WriteLine(copy));
}</code>
Salin selepas log masuk

Kini, setiap lambda menangkap pembolehubah copy yang berasingan, mengekalkan nilai yang betul untuk setiap lelaran.

Mengapa Salinan Tempatan Penting

Perbezaannya terletak pada skop berubah-ubah. Rujukan berkongsi lokasi memori yang sama; perubahan segera dicerminkan. Salinan mencipta petikan bebas bagi nilai pembolehubah pada masa tangkapan. Perubahan seterusnya kepada pembolehubah asal tidak berkaitan dengan salinan tangkapan lambda.

Atas ialah kandungan terperinci Bagaimanakah Saya Mencegah Tingkah Laku Tidak Dijangka Semasa Menangkap Pembolehubah dalam C# Lambda Expressions?. 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