Rumah > pembangunan bahagian belakang > C++ > Adakah penggunaan semula pembolehubah gelung C#'s foreach` menyebabkan tingkah laku yang tidak dijangka dengan lambdas?

Adakah penggunaan semula pembolehubah gelung C#'s foreach` menyebabkan tingkah laku yang tidak dijangka dengan lambdas?

Barbara Streisand
Lepaskan: 2025-01-31 21:26:09
asal
773 orang telah melayarinya

Does C#'s `foreach` Loop Variable Reuse Cause Unexpected Behavior with Lambdas?

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;
   ...
}
Salin selepas log masuk
Tidak seperti untuk kitaran, skop pembolehubah untuk gelung berada di dalam kitaran. Ketidakkonsistenan ini meningkatkan risiko ralat yang tidak perlu dan membuat debugging sukar.

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!

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