Mengapa Ekspresi Lambda Saya Menangkap Nilai Terakhir Pembolehubah Gelung?

Patricia Arquette
Lepaskan: 2024-10-28 22:50:02
asal
656 orang telah melayarinya

Why Does My Lambda Expression Capture the Last Value of a Loop Variable?

Menangkap Pembolehubah dalam Ungkapan Lambda Dalam Lelaran 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.

Penjelasan

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.

Pembetulan

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!