foreach
Pembolehubah dan penutupan berbilang benang dalam C#: Adakah ia selamat?
Apabila menggunakan foreach
untuk menggelungkan koleksi dalam C#, adalah penting untuk memahami skop dan gelagat pembolehubah lelaran, terutamanya dalam persekitaran berbilang benang.
Coretan kod berikut meneroka sama ada selamat untuk menggunakan foreach
pembolehubah secara langsung sebagai hujah penutupan dalam berbilang benang dan sama ada salinan setempat perlu dibuat untuk setiap lelaran.
Pra-C# 5 versi
Dalam versi sebelum C# 5, foreach
pembolehubah telah diisytiharkan di luar gelung. Ini bermakna bahawa satu contoh pembolehubah dikongsi merentas semua lelaran.
Pertimbangkan coretan kod pertama:
foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); }
Dalam contoh ini, pembolehubah f
dikongsi antara semua urutan yang dibuat semasa lelaran gelung. Ini boleh membawa kepada hasil yang tidak dapat diramalkan, kerana berbilang urutan mungkin akhirnya memanggil kaedah pada kejadian Foo
yang berbeza, atau kaedah memanggil pada tika yang sama beberapa kali.
Untuk mengelakkan masalah sedemikian, adalah disyorkan untuk membuat salinan setempat pembolehubah f
dalam setiap lelaran, seperti yang ditunjukkan dalam coretan kod kedua:
foreach (Foo f in ListOfFoo) { Foo f2 = f; Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); }
C# 5 dan ke atas
C# 5 memperkenalkan perubahan ketara. Dalam C# 5 dan ke atas, foreach
pembolehubah ditakrifkan dalam skop gelung. Ini bermakna setiap lelaran mempunyai contoh pembolehubahnya sendiri.
Oleh itu, dua coretan kod menjadi setara dan selamat. Setiap rangkaian kini mempunyai contoh f
tersendiri dalam skop penutupannya, menghapuskan risiko kekeliruan atau ketidakkonsistenan.
Atas ialah kandungan terperinci Adakah Menggunakan Pembolehubah `foreach` Secara Terus dalam Penutupan Berbilang Benang C# Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!