Mengapakah ungkapan lambda menangkap nilai akhir pembolehubah lelaran dan bukannya nilainya semasa setiap lelaran dalam gelung foreach?

Patricia Arquette
Lepaskan: 2024-10-31 08:43:02
asal
651 orang telah melayarinya

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

Gelagat Tidak Dijangka dalam Ungkapan Lambda Menggunakan Pembolehubah Iterator

Dalam kod yang diberikan, output yang dijangkakan apabila memanggil myClass.Execute() ialah "Hai String", "Hi Single", "Hi Int32." Walau bagaimanapun, kod tersebut mencetak "Hi Int32" tiga kali. Mengapakah tingkah laku yang tidak dijangka ini berlaku dan bagaimanakah ia boleh dibetulkan?

Isunya terletak pada ungkapan lambda yang digunakan dalam gelung foreach:

var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
Salin selepas log masuk

Dalam kod ini, jenis pembolehubah gelung ialah ditangkap oleh ungkapan lambda. Walau bagaimanapun, apa yang ditangkap bukanlah nilai jenis pada lelaran tertentu, tetapi rujukan kepada pembolehubah itu sendiri.

Oleh itu, apabila perwakilan PrintHelloType dipanggil kemudian, ia menggunakan nilai jenis pada akhir gelung, iaitu "Int32." Ini menghasilkan output yang tidak dijangka.

Penyelesaian:

Untuk mencapai matlamat yang diingini, pembolehubah baharu boleh digunakan untuk menangkap nilai jenis semasa setiap lelaran:

foreach (var type in types)
{
   var newType = type;
   var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
   helloMethods.Add(sayHello);
}
Salin selepas log masuk

Kini setiap ungkapan lambda menangkap nilai newType, iaitu nilai yang betul untuk lelaran tertentu. Output yang dijangkakan kemudiannya dihasilkan: "Hi String", "Hi Single", "Hi Int32."

Atas ialah kandungan terperinci Mengapakah ungkapan lambda menangkap nilai akhir pembolehubah lelaran dan bukannya nilainya semasa setiap lelaran dalam gelung foreach?. 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