Maison >développement back-end >C++ >Pourquoi les expressions Lambda dans les boucles produisent-elles des résultats inattendus ?

Pourquoi les expressions Lambda dans les boucles produisent-elles des résultats inattendus ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-14 11:26:46727parcourir

Why Do Lambda Expressions in Loops Produce Unexpected Results?

Expressions Lambda et variables d'itération de boucle : un piège potentiel

L'utilisation de variables d'itération de boucle directement dans les expressions lambda est généralement déconseillée. Cette pratique peut produire des résultats inattendus en raison de la façon dont les expressions lambda gèrent la capture de variables.

Les

Les expressions Lambda capturent la référence à une variable, pas sa valeur au moment de la capture. Par conséquent, lorsqu'une boucle itère, les expressions lambda créées dans la boucle font toutes référence à la même variable d'itération en constante évolution. Cela conduit tous les lambdas à utiliser finalement la valeur final de la variable une fois la boucle terminée, et non sa valeur au moment où chaque lambda a été créée.

Illustrons cela avec un exemple VB.NET :

<code class="language-vb.net">Dim actions = new List(Of Action)()

For i As Integer = 0 To 9
    actions.Add(New Action(Function() Console.WriteLine(i)))
Next

For Each action As Action In actions
    action()
End For</code>

Vous pourriez vous attendre à ce que cela imprime 0 à 9. Au lieu de cela, il imprime 10 dix fois ! En effet, chaque Action de la liste actions fait référence au même i, et au moment où la deuxième boucle s'exécute, i a déjà atteint sa valeur finale de 10.

Le problème est amplifié lorsque le corps de la boucle a des effets secondaires impactant la variable référencée par l'expression lambda. Cela peut entraîner des incohérences difficiles à déboguer.

La solution : créer une copie locale

Pour éviter cela, créez une copie locale de la variable d'itération à l'intérieur de la boucle :

<code class="language-vb.net">Dim actions = new List(Of Action)()

For i As Integer = 0 To 9
    Dim localI As Integer = i ' Create a local copy
    actions.Add(New Action(Function() Console.WriteLine(localI)))
Next

For Each action As Action In actions
    action()
End For</code>

Maintenant, chaque expression lambda capture une localI variable unique, conservant sa valeur au moment de la création. La sortie sera correctement comprise entre 0 et 9. Ce simple changement garantit que chaque lambda fonctionne avec sa propre valeur indépendante, évitant ainsi un comportement inattendu.

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