Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menghalang Ungkapan Lambda daripada Menangkap Rujukan dalam C#?

Bagaimanakah Saya Boleh Menghalang Ungkapan Lambda daripada Menangkap Rujukan dalam C#?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-19 00:01:09168semak imbas

How Can I Prevent Lambda Expressions from Capturing References in C#?

Mencegah Tangkapan Rujukan dalam C# Lambda Expressions

Ekspresi lambda C#, secara lalai, menangkap pembolehubah melalui rujukan. Ini bermakna ungkapan lambda mengekalkan penunjuk kepada pembolehubah asal dan sebarang perubahan pada pembolehubah itu selepas penciptaan lambda akan ditunjukkan apabila lambda dilaksanakan.

Berikut ialah contoh yang menggambarkan tingkah laku ini:

<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>

Melaksanakan kod ini akan mencetak "10" sepuluh kali. Ini berlaku kerana setiap lambda menangkap rujukan kepada pembolehubah tunggal i, yang nilainya ialah 10 pada masa gelung selesai.

Untuk mengelakkan tangkapan rujukan ini dan memastikan setiap lambda mendapat salinan nilai pembolehubah gelungnya sendiri, buat salinan setempat dalam gelung:

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i; // Create a local copy
    actions.Add(() => Console.WriteLine(copy));
}</code>

Kini, setiap lambda menangkap pembolehubah copy yang berbeza, mengekalkan nilai pada masa penciptaannya. Output akan memaparkan nombor 0 hingga 9 dengan betul.

Adalah penting untuk memahami bahawa tidak seperti beberapa bahasa lain (seperti C ), C# tidak menawarkan mekanisme langsung untuk menyatakan rujukan atau tangkapan nilai secara eksplisit dalam sintaks ungkapan lambda itu sendiri. Mencipta salinan tempatan ialah penyelesaian standard untuk mencapai semantik penangkapan nilai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Ungkapan Lambda daripada Menangkap Rujukan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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