Rumah >pembangunan bahagian belakang >C++ >Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Iterator dalam C#?
Menggunakan Ungkapan Lambda dengan Iterator dalam C#
Dalam C#, ungkapan lambda menyediakan cara yang ringkas dan mudah untuk mentakrifkan fungsi tanpa nama. Walau bagaimanapun, perangkap biasa apabila menggunakan ungkapan lambda dengan iterator ialah pembolehubah yang ditangkap bukanlah nilai semasa pembolehubah lelaran, sebaliknya nilai akhir.
Pertimbangkan kod berikut:
<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) }; List<PrintHelloType> helloMethods = new List<PrintHelloType>(); foreach (var type in types) { var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting)); helloMethods.Add(sayHello); } foreach (var helloMethod in helloMethods) { Console.WriteLine(helloMethod("Hi")); }</code>
Apabila anda melaksanakan kod ini, anda mungkin mengharapkan ia mencetak output berikut:
Hi String Hi Single Hi Int32
Walau bagaimanapun, output sebenar ialah:
Hi Int32 Hi Int32 Hi Int32
Ini kerana ungkapan lambda menangkap jenis pembolehubah gelung, bukan nilainya pada masa lambda ditakrifkan. Oleh itu, apabila lambda dilaksanakan, ia menggunakan nilai akhir jenis, iaitu Int32.
Untuk menyelesaikan isu ini dan mendapatkan output yang diingini, anda boleh menggunakan pembolehubah setempat untuk menangkap nilai semasa lelaran pembolehubah, seperti yang ditunjukkan dalam kod berikut:
<code class="c#">foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }</code>
Dalam kes ini, ungkapan lambda menangkap pembolehubah tempatan newType, yang diberikan nilai semasa jenis. Ini memastikan bahawa ungkapan lambda menggunakan nilai jenis yang betul apabila ia dilaksanakan.
Atas ialah kandungan terperinci Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Iterator dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!