C# Lambda Expressions dan foreach
Keselamatan Benang Gelung
Artikel ini mengkaji keselamatan urutan mengakses pembolehubah dalam foreach
gelung di dalam ungkapan lambda C#, memfokuskan pada perbezaan antara versi C#.
Kelakuan Pra-C# 5
Dalam versi C# sebelum 5, mengakses terus pembolehubah yang diisytiharkan di luar gelung foreach
dalam ungkapan lambda yang digunakan dalam konteks berbilang benang (cth., dalam Thread
pembina) adalah tidak selamat. Ini kerana pembolehubah lelaran gelung foreach
dikongsi merentas semua lelaran. Akibatnya, berbilang rangkaian mungkin mengakses dan mengubah suai pembolehubah yang sama, membawa kepada keputusan yang tidak dapat diramalkan dan tidak betul. Keadaan perlumbaan berkemungkinan besar.
C# 5 dan Kemudian
Bermula dengan C# 5, pengendalian pengkompil bagi iterator dalam gelung foreach
meningkatkan keselamatan benang dengan ketara. Pengkompil kini berkesan mencipta contoh baharu pembolehubah lelaran untuk setiap lelaran. Ini bermakna setiap ungkapan lambda menangkap salinan unik pembolehubah, menghapuskan risiko keadaan perlumbaan. Oleh itu, dalam versi C# 5 dan lebih baru, kedua-dua pendekatan (menggunakan pembolehubah lelaran tunggal yang diisytiharkan di luar atau di dalam gelung) secara amnya dianggap selamat-benang.
Contoh Ilustrasi (Tingkah Laku Tidak Selamat Pra-C#5)
Coretan kod berikut menyerlahkan kelakuan tidak selamat dalam versi pra-C#5:
<code class="language-csharp">static void Main() { int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; foreach (int i in data) { new Thread(() => Console.WriteLine(i)).Start(); } Console.ReadLine(); }</code>
Menjalankan kod ini berkemungkinan akan menghasilkan output yang nilai i
tidak betul mengikut urutan, menunjukkan keadaan perlumbaan. Setiap urutan menangkap pembolehubah i
yang sama dan nilainya mungkin berubah apabila urutan dapat melaksanakan ungkapan lambdanya.
Kesimpulan
Walaupun versi C# yang lebih lama memerlukan pengendalian yang teliti bagi pembolehubah lelaran dalam gelung foreach
dalam ungkapan lambda untuk memastikan keselamatan benang, versi C# 5 dan yang lebih baru mengurangkan isu ini melalui pengoptimuman pengkompil. Walau bagaimanapun, masih merupakan amalan yang baik untuk mengambil kira isu konkurensi yang berpotensi, terutamanya apabila berurusan dengan sumber yang dikongsi dalam ungkapan lambda, tanpa mengira versi C#. Menggunakan pembolehubah tempatan dalam setiap lelaran kekal sebagai amalan terbaik untuk kejelasan dan kebolehselenggaraan.
Atas ialah kandungan terperinci Adakah Mengakses Pembolehubah dalam Gelung Foreach Dalam Benang Ungkapan Lambda C# Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!