Maison >développement back-end >C++ >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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 08:43:02674parcourir

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

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!

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