Rumah >pembangunan bahagian belakang >C++ >Mengapa ekspresi C# Lambda dalam gelung menangkap nilai pembolehubah akhir, dan bagaimanakah ini dapat diperbaiki?

Mengapa ekspresi C# Lambda dalam gelung menangkap nilai pembolehubah akhir, dan bagaimanakah ini dapat diperbaiki?

Barbara Streisand
Barbara Streisandasal
2025-02-03 08:10:09854semak imbas

Why Do C# Lambda Expressions in Loops Capture the Final Variable Value, and How Can This Be Fixed?

Memahami C# Lambda Expression Variable Capture in Loops

Masalah kerap dalam pengaturcaraan C# melibatkan ekspresi lambda dalam gelung. Cara ekspresi Lambda menangkap pembolehubah boleh membawa kepada hasil yang tidak dijangka. Mari kita meneroka isu ini dan penyelesaiannya.

Pertimbangkan kod ini:

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

int variable = 0;
while (variable < 10)
{
    actions.Add(() => variable * 2);
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>
output yang dijangkakan adalah urutan nombor walaupun (0, 2, 4, 6, 8). Walau bagaimanapun, output sebenar adalah lima 10s. Ini berlaku kerana setiap ekspresi Lambda menangkap rujukan

ke , bukan nilainya pada masa penciptaannya. Pada masa lambdas dipanggil, variable telah mencapai nilai terakhir 10. variable

Penyelesaian: Membuat salinan

Untuk membetulkannya, kita perlu membuat salinan pembolehubah gelung dalam skop setiap ekspresi lambda:

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

int variable = 0;
while (variable < 10)
{
    int copy = variable; // Create a copy of the variable
    actions.Add(() => copy * 2); 
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>
Sekarang, setiap ekspresi Lambda menangkap nilai bebas dari nilai

pada masa penciptaannya, menghasilkan output yang diharapkan. variable

c# 5 dan gelung foreach

Penting untuk diperhatikan bahawa tingkah laku ini kurang menjadi kebimbangan dengan

gelung dalam versi C# 5 dan kemudian. Pengkompil mengendalikan penangkapan berubah secara berbeza dalam foreach untuk mengelakkan isu ini. Walau bagaimanapun, kaedah salinan eksplisit tetap menjadi amalan terbaik untuk kejelasan dan keserasian dengan versi C# yang lebih tua. Menggunakan pendekatan ini memastikan tingkah laku yang konsisten merentas semua versi C# dan jenis gelung. foreach

Atas ialah kandungan terperinci Mengapa ekspresi C# Lambda dalam gelung menangkap nilai pembolehubah akhir, dan bagaimanakah ini dapat diperbaiki?. 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