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
Barbara Streisandasal
2025-01-19 00:06:13185semak imbas

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>

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>

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!

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