Rumah >pembangunan bahagian belakang >C++ >Kenapa penggunaan semula pembolehubah gelung C#'s foreach` membawa kepada perangkap penutupan?
c# gelung: kecacatan reka bentuk yang membawa kepada isu penutupan foreach
boleh membuat "akses kepada penutupan diubahsuai" ralat. Pengendalian pengkompil pembolehubah gelung adalah faktor utama dalam masalah ini. foreach
Masalah dengan skop berubah -ubah
Tidak seperti kebanyakan bahasa, C# mengisytiharkan pembolehubah gelung foreach
di luar badan gelung. Ini bermakna hanya satu contoh pembolehubah untuk keseluruhan gelung. Setiap lelaran mengemas kini pembolehubah tunggal ini, yang membawa kepada tingkah laku yang tidak dijangka apabila digunakan dalam penutupan. Penutup kemudian menangkap nilai akhir pembolehubah, bukan nilai dari setiap lelaran.
Batasan pembolehubah gelung
Batasan lain ialah pembolehubah gelung tidak dapat diakses di luar skop gelung. Ini tidak konsisten dengan bagaimana pembolehubah gelung biasanya berkelakuan dalam bahasa lain dan memaksa pemaju untuk menggunakan penyelesaian jika mereka memerlukan nilai pembolehubah selepas gelung selesai. foreach
Kenapa reka bentuk ini?
Spesifikasi C# awal adalah samar -samar mengenai skop pembolehubah gelung. Apabila sokongan penutupan ditambah dalam C# 2.0, keputusan untuk meletakkan pembolehubah di luar gelung (sama dengan foreach
gelung) telah dibuat. Walau bagaimanapun, ini telah terbukti bermasalah, bertentangan dengan tingkah laku yang diharapkan dan menyebabkan kesilapan. for
Penyelesaian C# 5
Mengiktiraf kecacatan reka bentuk ini, Microsoft ditujukan kepada C# 5. Dalam C# 5 dan kemudian, pembolehubah gelung kini dikeluarkan foreach
dalam setiap lelaran. Ini memastikan bahawa penutupan menangkap contoh baru pembolehubah untuk setiap kitaran gelung, menyelesaikan masalah "akses kepada penutupan yang diubah suai" dan menyelaraskan C# dengan amalan pengaturcaraan biasa.
Atas ialah kandungan terperinci Kenapa penggunaan semula pembolehubah gelung C#'s foreach` membawa kepada perangkap penutupan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!