Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah C# Mengendalikan Tangkapan Pembolehubah dalam Penutupan?

Bagaimanakah C# Mengendalikan Tangkapan Pembolehubah dalam Penutupan?

Barbara Streisand
Lepaskan: 2025-01-12 21:07:43
asal
749 orang telah melayarinya

How Does C# Handle Variable Capture in Closures?

Pemahaman mendalam tentang tangkapan pembolehubah dalam penutupan C#

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.

Pada asasnya cara pembolehubah tempatan ditangkap

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.

Tangkap jenis nilai dan jenis rujukan

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.

Tiada operasi tinju

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.

Contoh terperinci

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan