Maison > Article > développement back-end > Pourquoi une expression lambda capture-t-elle la valeur finale d'une variable itératrice au lieu de sa valeur lors de chaque itération dans une boucle foreach ?
Comportement inattendu dans les expressions Lambda utilisant une variable itératrice
Dans le code donné, la sortie attendue lors de l'appel de myClass.Execute() est "Salut String", "Salut Single", "Salut Int32." Cependant, le code imprime « Hi Int32 » trois fois. Pourquoi ce comportement inattendu se produit-il et comment peut-il être corrigé ?
Le problème réside dans l'expression lambda utilisée dans la boucle foreach :
var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
Dans ce code, le type de variable de boucle est capturé par l’expression lambda. Cependant, ce qui est capturé n'est pas la valeur de type à l'itération spécifique, mais la référence à la variable elle-même.
Par conséquent, lorsque le délégué PrintHelloType est invoqué ultérieurement, il utilise la valeur de type à la fin de la boucle, qui est "Int32". Cela entraîne un résultat inattendu.
Solution :
Pour atteindre l'objectif souhaité, une nouvelle variable peut être utilisée pour capturer la valeur du type lors de chaque itération :
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
Désormais, chaque expression lambda capture la valeur de newType, qui est la valeur correcte pour l'itération spécifique. Le résultat attendu est alors produit : "Hi String", "Hi Single", "Hi Int32."
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!