c#
penggunaan semula pembolehubah kitaran: masalah yang tersisa dari sejarah foreach
Apabila menggunakan ekspresi lambda atau kaedah tanpa nama, penggunaan semula pembolehubah kitaran C#boleh menyebabkan masalah yang berpotensi. Penggunaan semula ini akan membawa kepada masalah "penutupan selepas diubah suai", di mana semua ekspresi lambda dalam rujukan kitaran nilai akhir pembolehubah, bukan nilai semasa setiap lelaran.
Kemunculan tingkah laku khas ini adalah kerana pemboleh ubah peredaran diisytiharkan di luar domain yang beredar, seperti yang ditunjukkan dalam penukaran kod di bawah: foreach
Walaupun sesetengah orang mendakwa bahawa pembolehubah mengisytiharkan di luar kitaran tidak akan membawa kelebihan prestasi, ia hanya berguna untuk mengaksesnya selepas kitaran berakhir, tetapi kaedah ini boleh menyebabkan kesilapan yang serius disebabkan oleh masalah penutupan.
string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }
Walaupun pilihan reka bentuk ini boleh dibuat sebelum pengenalan ekspresi lambda dan kaedah tanpa nama, ia belum diubahsuai dan ia masih akan membawa masalah kepada pemaju.
foreach
Perubahan utama dalam C# 5
Mengakui kecacatan reka bentuk ini, C# 5 memperkenalkan perubahan besar untuk menyelesaikannya.
Pembolehubah bulat kini bertindak secara logik di dalam badan kitaran. Ini bermakna penutupan akan menangkap salinan baru pembolehubah pada setiap lelaran, dengan itu menghapuskan masalah penutupan yang diubah suai. Walau bagaimanapun, gelung untuk tidak akan berubah, dan perubahan itu tidak akan dikesan kembali ke versi C#awal. Oleh itu, pemaju harus terus beroperasi dengan teliti apabila menggunakan kitaran
dengan ekspresi lambda atau kaedah tanpa nama.Atas ialah kandungan terperinci Adakah penggunaan semula pembolehubah gelung C#'s foreach` menyebabkan tingkah laku yang tidak dijangka dengan lambdas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!