Les expressions Lambda fournissent un moyen concis de définir des fonctions en ligne dans des boucles. Cependant, l'utilisation de variables d'itération directement dans les lambdas peut entraîner un comportement inattendu ultérieurement.
Piège Lambda des variables itératives :
Considérez le code suivant :
<code class="language-c#">for (int i = 0; i < 10; i++) { Action action = () => Console.WriteLine(i); actions.Add(action); } foreach (var action in actions) { action(); }</code>
On pourrait penser que chaque lambda imprimera la valeur correspondante de i. Cependant, en raison des fermetures, tous les lambdas partagent la même référence capturée à i.
Résultat d'impression inattendu :
Lorsque la boucle se termine, i devient 10 et tous les lambdas pointent désormais vers cette valeur finale. En conséquence, l'exécution du lambda imprimera "10" dix fois au lieu de la séquence attendue de 0 à 9.
Ce comportement résulte du fait que les fermetures lambda conservent les références aux variables déclarées dans leur portée, même une fois la boucle terminée.
Évitements et alternatives :
Pour résoudre ce problème, créez une variable locale dans la boucle et attribuez-lui la valeur de la variable d'itération :
<code class="language-c#">for (int i = 0; i < 10; i++) { int j = i; // 创建一个局部变量 Action action = () => Console.WriteLine(j); actions.Add(action); } foreach (var action in actions) { action(); }</code>
Cela garantit que chaque lambda capture une valeur différente de j, ce qui entraîne la séquence d'impressions attendue.
Gardez à l'esprit que l'utilisation de variables d'itération directement dans les expressions lambda peut entraîner des conditions inattendues liées à la fermeture. Envisagez plutôt de créer des variables locales pour capturer exactement la valeur dont vous avez besoin.
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!