Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Memastikan Ungkapan Lambda Menangkap Pembolehubah mengikut Nilai Daripada Rujukan dalam C#?
Tangkapan nilai dan tangkapan rujukan dalam ungkapan C# Lambda
Dalam C#, ungkapan Lambda boleh menangkap pembolehubah dalam skop yang disertakan. Secara lalai, tangkapan ini adalah melalui rujukan, yang bermaksud bahawa ungkapan lambda mengakses lokasi memori yang sama seperti pembolehubah asal. Walau bagaimanapun, dalam beberapa kes anda mungkin mahu menangkap salinan pembolehubah dan bukannya rujukan.
Soalan:
Pertimbangkan kod C# berikut:
<code class="language-csharp">class Program { delegate void Action(); static void Main(string[] args) { List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) actions.Add(() => Console.WriteLine(i)); foreach (Action a in actions) a(); } }</code>
Penerangan masalah:
Output yang dijangkakan adalah untuk setiap ungkapan Lambda mencetak nilai i yang sepadan semasa melelaran melalui senarai. Walau bagaimanapun, dalam contoh ini, semua ungkapan lambda mencetak nilai 10, menunjukkan bahawa mereka semua merujuk kepada pembolehubah yang sama i. Ini kerana ungkapan lambda menangkap i melalui rujukan.
Penyelesaian:
Untuk memaksa ungkapan lambda menangkap salinan i , satu penyelesaian ialah membuat salinan separa dahulu:
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // 创建局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
Penjelasan:
Dengan mencipta salinan tempatan i dalam gelung, ungkapan Lambda menangkap nilai salinan , yang merupakan salinan i asal pada masa itu. Ini memastikan bahawa setiap ungkapan Lambda mempunyai salinan nilainya sendiri dan nilai i yang sepadan akan dicetak.
Perbezaan:
Perbezaan antara menangkap pembolehubah melalui rujukan dan menangkapnya mengikut nilai ialah cara pembolehubah tersebut berinteraksi dengan pembolehubah di luar ungkapan lambda.
Atas ialah kandungan terperinci Bagaimanakah Saya Memastikan Ungkapan Lambda Menangkap Pembolehubah mengikut Nilai Daripada Rujukan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!