


Bagaimanakah Saya Memastikan Ungkapan Lambda Menangkap Pembolehubah mengikut Nilai Daripada Rujukan dalam C#?
Jan 19, 2025 am 12:14 AMTangkapan 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(); } }
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)); }
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!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

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

Gulc: Perpustakaan C dibina dari awal

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Penggunaan dan perkongsian frasa yang berbeza

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

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

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