Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah ungkapan lambda menangkap nilai akhir pembolehubah lelaran dan bukannya nilainya semasa setiap lelaran dalam gelung foreach?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-31 08:43:02600semak imbas

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

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);
}

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!

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