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:
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()); }
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:
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()); }
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!