Maison >développement back-end >C++ >Pourquoi les expressions Lambda capturent-elles la valeur finale des variables d'itération ?
Pièges potentiels liés à l'utilisation de variables d'itération dans les expressions Lambda
Dans le domaine de la programmation, les expressions Lambda offrent un moyen concis de représenter des fonctions anonymes. Cependant, l'utilisation de variables d'itération dans les expressions lambda peut conduire à des résultats inattendus.
Considérez le code suivant :
<code class="language-c#">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action action in actions) { action(); }</code>
Ce code associe par inadvertance toutes les expressions Lambda à la même variable d'itération i
. Par conséquent, lorsque chaque expression Lambda s'exécute, elle fait référence à la valeur finale de i
, et non à la valeur attendue de i
lors de la création de Lambda.
Par conséquent, le résultat peut ne pas être celui attendu. Au lieu d'imprimer 0 à 9 comme prévu, le code imprime 10 dix fois. Il convient de noter que ce comportement résulte du fait que tous les délégués impliqués capturent une seule variable.
Pour éviter ce résultat inattendu, il est recommandé de créer une variable locale à l'intérieur de la boucle et de lui attribuer la valeur de la variable d'itération. De cette façon, chaque expression lambda fait référence à une variable locale différente, garantissant qu'elle conserve la valeur attendue. Le code modifié est le suivant :
<code class="language-c#">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { int temp = i; // 创建局部变量 actions.Add(() => Console.WriteLine(temp)); } foreach (Action action in actions) { action(); }</code>
De cette façon, chaque expression Lambda capturera une temp
variable indépendante, évitant ainsi le problème de l'écrasement des valeurs des variables, et la sortie finale affichera correctement 0 à 9.
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!