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.
LesLes 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!