Maison > développement back-end > C++ > Comment puis-je éviter un comportement inattendu lors de la capture de variables dans des expressions Lambda C# ?

Comment puis-je éviter un comportement inattendu lors de la capture de variables dans des expressions Lambda C# ?

Barbara Streisand
Libérer: 2025-01-19 00:06:13
original
189 Les gens l'ont consulté

How Do I Prevent Unexpected Behavior When Capturing Variables in C# Lambda Expressions?

Comprendre la capture de variables d'expression C# Lambda

Les expressions lambda C# offrent un moyen compact de définir des fonctions anonymes. Cependant, leur interaction avec les variables du périmètre environnant peut être délicate.

Le problème : modification des variables partagées

Examinons un problème courant. Le code suivant vise à créer une liste d'actions, chacune imprimant une valeur de compteur différente :

<code class="language-csharp">List<Action> actions = new List<Action>();

for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action a in actions)
    a();</code>
Copier après la connexion

Étonnamment, ceci imprime « 10 » dix fois. Le lambda capture une référence à i, pas sa valeur. Au fur et à mesure que la boucle modifie i, tous les lambdas voient la valeur finale.

La solution : capturer par valeur

C# ne prend pas directement en charge la syntaxe de capture par valeur comme celle de C 0x [=]. La solution de contournement consiste à créer une copie locale dans la portée de la boucle :

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i; // Create a local copy
    actions.Add(() => Console.WriteLine(copy));
}</code>
Copier après la connexion

Maintenant, chaque lambda capture une copy variable distincte, préservant la valeur correcte pour chaque itération.

Pourquoi les copies locales sont importantes

La différence réside dans la portée variable. Une référence partage le même emplacement mémoire ; les changements sont immédiatement reflétés. Une copie crée un instantané indépendant de la valeur de la variable au moment de la capture. Les modifications ultérieures apportées à la variable d'origine ne sont pas pertinentes pour la copie capturée du lambda.

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