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>
É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>
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!