Rumah >pembangunan bahagian belakang >C++ >Mengapa Ekspresi Lambda Saya Menangkap Nilai Terakhir Pembolehubah Gelung?
Coretan kod menunjukkan gelagat yang tidak dijangka apabila menggunakan pembolehubah lelaran bagi gelung foreach dalam ungkapan lambda. Selepas pelaksanaan, bukannya mencetak "Hi String," "Hi Single," dan "Hi Int32," ia mencetak "Hi Int32" untuk ketiga-tiga kaedah.
Tingkah laku ini berpunca daripada sifat ungkapan lambda dan pembolehubah yang ditangkap. Apabila ungkapan lambda ditakrifkan di dalam gelung, ia menangkap rujukan pembolehubah gelung, bukan nilainya. Akibatnya, ia merujuk kepada pembolehubah yang sama sepanjang lelaran gelung.
Dalam kod yang disediakan, jenis pembolehubah ditangkap oleh ungkapan lambda. Walau bagaimanapun, kod itu tidak mengambil kira fakta bahawa rujukan yang sama untuk jenis akan dikongsi antara semua lelaran gelung. Akibatnya, setiap ungkapan lambda akhirnya menangkap nilai jenis daripada lelaran terakhir, menghasilkan cetakan yang tidak dijangka.
Untuk menyelesaikan isu ini dan mencapai matlamat yang diingini, anda perlu memastikan bahawa setiap ungkapan lambda menangkap nilai jenis yang unik. Untuk melakukan ini, cipta pembolehubah baharu untuk setiap lelaran, menetapkan nilai semasa jenis:
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
Dengan menggunakan newType, anda mencipta salinan jenis dengan berkesan, menangkap nilainya daripada lelaran semasa. Ini memastikan bahawa setiap ungkapan lambda mempunyai rujukan unik kepada nilai jenisnya sendiri, yang membawa kepada output yang betul.
Atas ialah kandungan terperinci Mengapa Ekspresi Lambda Saya Menangkap Nilai Terakhir Pembolehubah Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!