Rumah > pembangunan bahagian belakang > C++ > Adakah Mengakses Pembolehubah dalam Gelung Foreach Dalam Benang Ungkapan Lambda C# Selamat?

Adakah Mengakses Pembolehubah dalam Gelung Foreach Dalam Benang Ungkapan Lambda C# Selamat?

DDD
Lepaskan: 2025-01-22 07:11:08
asal
286 orang telah melayarinya

Is Accessing Variables in Foreach Loops Within C# Lambda Expressions Thread-Safe?

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

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!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan