penggunaan semula pembolehubah kitaran: perangkap yang tidak perlu foreach
Apabila menggunakan ekspresi lambda atau kaedah tanpa nama di C#, akses penutupan yang diubahsuai mungkin muncul.
foreach
pengkompil biasanya mengisytiharkan pembolehubah kitaran di luar badan kitaran, seperti yang ditunjukkan dalam contoh penutupan yang diubah suai:
Ini berbeza daripada jangkaan pembolehubah yang diisytiharkan dalam kitaran:
string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }
Pernyataan pembolehubah luaran telah memburukkan lagi masalah akses penutupan yang diubahsuai kerana ia mewujudkan skop yang lebih lama untuk pembolehubah. Pembolehubah yang diisytiharkan dalam kitaran <环> tidak boleh diakses di luar kitaran.
while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... }
pengkompil memutuskan untuk menggunakan semula pembolehubah bulat sebelum pengenalan ekspresi lambda dan kaedah tanpa nama. Oleh itu, tidak ada perangkap yang berpotensi bahawa penggunaan semula pembolehubah telah dipertimbangkan sepenuhnya pada masa itu. foreach
Walaupun pembaikan ini adalah peningkatan yang popular, apabila menggunakan versi lama versi lama atau tidak menyokong pembaikan ini, ia masih perlu memberi perhatian kepada masalah ini.
Atas ialah kandungan terperinci Kenapa penggunaan semula pembolehubah gelung C#'s foreach` menyebabkan masalah dengan penutupan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!