Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Memastikan Ungkapan Lambda Menangkap Pembolehubah mengikut Nilai Daripada Rujukan dalam C#?

Bagaimanakah Saya Memastikan Ungkapan Lambda Menangkap Pembolehubah mengikut Nilai Daripada Rujukan dalam C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-19 00:14:11238semak imbas

How Do I Ensure Lambda Expressions Capture Variables by Value Instead of by Reference in 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.

  • Tangkap melalui rujukan: Ekspresi Lambda mengakses terus lokasi memori pembolehubah asal. Sebarang perubahan yang dibuat kepada pembolehubah di luar ungkapan lambda akan ditunjukkan dalam ungkapan lambda dan begitu juga sebaliknya.
  • Tangkap mengikut nilai: Ungkapan Lambda mengakses salinan nilai pembolehubah asal semasa menangkap. Sebarang perubahan yang dibuat kepada pembolehubah di luar ungkapan lambda tidak menjejaskan salinan yang ditangkap oleh ungkapan lambda, dan nilai ungkapan lambda kekal tidak berubah.

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!

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