Rumah > pembangunan bahagian belakang > C++ > Kenapa penggunaan semula pembolehubah gelung C#'s foreach` menyebabkan masalah dengan penutupan?

Kenapa penggunaan semula pembolehubah gelung C#'s foreach` menyebabkan masalah dengan penutupan?

Mary-Kate Olsen
Lepaskan: 2025-01-31 21:11:11
asal
517 orang telah melayarinya

Why Does C#'s `foreach` Loop Variable Reuse Cause Problems with Closures?

c#

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.

Penggunaan semula pembolehubah dalam kitaran telah memburukkan lagi masalah ini.

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

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

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

Dalam C# 5, kecacatan reka bentuk ini akan diselesaikan melalui perubahan besar. Pembolehubah bulat akan secara logik di dalam badan kitaran untuk memastikan setiap penutupan mendapat salinan baru. Perubahan ini menghapuskan perangkap penutupan kitaran yang diubah suai.

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!

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