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
Libérer: 2025-01-14 11:26:46
original
721 Les gens l'ont consulté

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

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

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!

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