Maison >développement back-end >C++ >Pourquoi l'utilisation de variables d'itération dans les expressions Lambda conduit-elle à des résultats inattendus ?
Comprendre le comportement inattendu des variables d'itération dans les expressions Lambda
Un développeur a récemment rencontré un avertissement du compilateur concernant l'utilisation de variables d'itération de boucle dans les expressions lambda. Cela met en évidence un piège courant conduisant à un comportement inattendu du programme. Voyons pourquoi cela se produit.
Considérez cet exemple de code :
<code class="language-csharp">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>
On pourrait s'attendre à ce que cela imprime les nombres de 0 à 9 de manière séquentielle. Au lieu de cela, il imprime « 10 » dix fois. En effet, les expressions lambda ne capturent pas une copie de i
pour chaque itération. Au lieu de cela, ils capturent une référence à la variable i
. Au moment où la boucle foreach
s'exécute, la boucle est terminée et i
conserve sa valeur finale de 10. Chaque expression lambda imprime donc cette valeur finale.
Ce résultat inattendu souligne l’importance d’éviter ce modèle de codage. L'avertissement du compilateur constitue une protection cruciale. Pour obtenir la sortie séquentielle souhaitée, créez une nouvelle variable à l'intérieur de la boucle et attribuez-lui la valeur de la variable d'itération :
<code class="language-csharp">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { int j = i; // Capture a copy of i actions.Add(() => Console.WriteLine(j)); } foreach (Action action in actions) { action(); }</code>
Ce code révisé imprime correctement 0 à 9 car chaque expression lambda capture désormais une copie unique et indépendante de la valeur j
. Ce simple changement garantit le comportement attendu et cohérent.
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!