Maison  >  Article  >  développement back-end  >  Pourquoi mon expression Lambda capture-t-elle la dernière valeur d'une variable de boucle ?

Pourquoi mon expression Lambda capture-t-elle la dernière valeur d'une variable de boucle ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 22:50:02657parcourir

Why Does My Lambda Expression Capture the Last Value of a Loop Variable?

Capture de variables dans des expressions Lambda dans les itérations de boucle

L'extrait de code démontre le comportement inattendu lors de l'utilisation de la variable itérateur d'une boucle foreach dans une expression lambda. Lors de l'exécution, au lieu d'imprimer "Hi String", "Hi Single" et "Hi Int32", il imprime "Hi Int32" pour les trois méthodes.

Explication

Ce comportement provient de la nature des expressions lambda et leurs variables capturées. Lorsqu'une expression lambda est définie dans une boucle, elle capture la référence de la variable de boucle, pas sa valeur. De ce fait, elle fait référence à la même variable tout au long des itérations de la boucle.

Dans le code fourni, le type de variable est capturé par l'expression lambda. Cependant, le code ne tient pas compte du fait que la même référence au type sera partagée entre toutes les itérations de la boucle. Par conséquent, chaque expression lambda finit par capturer la valeur de type de la dernière itération, ce qui entraîne des impressions inattendues.

Correction

Pour résoudre ce problème et atteindre l'objectif souhaité, vous devez vous assurer que chaque expression lambda capture une valeur de type unique. Pour ce faire, créez une nouvelle variable pour chaque itération, en lui attribuant la valeur actuelle de type :

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

En utilisant newType, vous créez effectivement une copie de type, capturant sa valeur à partir de l'itération actuelle. Cela garantit que chaque expression lambda a une référence unique à sa propre valeur de type, conduisant à la sortie correcte.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn