Maison > développement back-end > C++ > Pourquoi les expressions Lambda capturent-elles la valeur finale des variables d'itération et comment cela peut-il être évité ?

Pourquoi les expressions Lambda capturent-elles la valeur finale des variables d'itération et comment cela peut-il être évité ?

Patricia Arquette
Libérer: 2025-01-14 06:09:43
original
919 Les gens l'ont consulté

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

Risques liés à l'utilisation de variables d'itération dans les expressions Lambda

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

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

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!

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