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

Jan 19, 2025 am 12:14 AM

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:

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();
    }
}
Salin selepas log masuk

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:

for (int i = 0; i < 10; i++)
{
    int copy = i; // 创建局部副本
    actions.Add(() => Console.WriteLine(copy));
}
Salin selepas log masuk

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Mar 03, 2025 pm 05:52 PM

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Gulc: Perpustakaan C dibina dari awal Gulc: Perpustakaan C dibina dari awal Mar 03, 2025 pm 05:46 PM

Gulc: Perpustakaan C dibina dari awal

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Mar 03, 2025 pm 05:53 PM

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Mar 03, 2025 pm 05:53 PM

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Penggunaan dan perkongsian frasa yang berbeza Penggunaan dan perkongsian frasa yang berbeza Mar 03, 2025 pm 05:51 PM

Penggunaan dan perkongsian frasa yang berbeza

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Mar 03, 2025 pm 05:51 PM

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Mar 12, 2025 pm 04:50 PM

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Mar 12, 2025 pm 04:52 PM

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap?

See all articles