Maison > développement back-end > C++ > le corps du texte

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
Libérer: 2024-10-31 08:43:02
original
614 Les gens l'ont consulté

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));
Copier après la connexion

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);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!