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

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

Patricia Arquette
Libérer: 2024-10-28 22:50:02
original
656 Les gens l'ont consulté

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

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!

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!