Tangkapan pembolehubah ialah aspek utama dalam penutupan C#, yang membolehkan fungsi penutup untuk mengakses dan memanipulasi pembolehubah dalam skop sekelilingnya. Dokumen ini memberikan pandangan yang mendalam tentang cara penangkapan berubah-ubah berfungsi, termasuk kesannya pada jenis nilai dan jenis rujukan, serta ketiadaan operasi tinju.
Bertentangan dengan kepercayaan popular, tangkapan berubah-ubah bukan hanya hasil daripada "sihir penyusun". C# menggunakan mekanisme strategi untuk mencipta kelas pembantu sementara untuk penutupan. Setiap pembolehubah yang ditangkap daripada skop sekeliling diberikan medan dalam kelas pembantu ini. Penutupan itu kemudiannya memegang rujukan kepada kelas pembantu ini, dengan itu mengakses pembolehubah yang ditangkap semasa hayatnya.
Jenis nilai dan jenis rujukan ditangkap dengan cara yang sama. Nilai yang ditangkap ialah pembolehubah sebenar itu sendiri, tanpa mengira jenisnya. Sebagai contoh, pembilang integer dalam kod yang disediakan ditangkap sebagai medan int dalam kelas pembantu.
Tidak seperti bahasa pengaturcaraan lain, C# tidak melakukan tinju apabila menangkap jenis nilai. Sebaliknya, nilai yang ditangkap disimpan terus dalam medan kelas pembantu. Kekurangan tinju ini menghapuskan overhed yang berkaitan dengan memori terurus dan memastikan operasi penutupan yang cekap.
Untuk menggambarkan proses penangkapan pembolehubah, pertimbangkan senario di mana ungkapan lambda digunakan untuk menangkap pembolehubah tunggal:
<code class="language-c#">using System; class Test { static void Main() { Action action = CreateShowAndIncrementAction(); action(); action(); } static Action CreateShowAndIncrementAction() { Random rng = new Random(); int counter = rng.Next(10); Console.WriteLine("Initial value for counter: {0}", counter); return () => { Console.WriteLine(counter); counter++; }; } }</code>
Dalam contoh ini, ungkapan lambda menangkap pembolehubah pembilang daripada kaedah sekeliling. Apabila lambda dipanggil, ia mengakses nilai pembilang yang ditangkap melalui contoh kelas pembantu. Ini membolehkan lambda mengubah suai pembolehubah pembilang, menunjukkan keupayaan penutupan untuk menangkap dan memanipulasi pembolehubah dalam skop yang disertakan.
Atas ialah kandungan terperinci Bagaimanakah C# Mengendalikan Tangkapan Pembolehubah dalam Penutupan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!