Comprendre C # Capture de variable d'expression Lambda dans les boucles
Un problème fréquent dans la programmation C # implique des expressions de lambda dans des boucles. La façon dont les expressions de lambda capturent les variables peuvent conduire à des résultats inattendus. Explorons ce problème et sa solution.
Considérez ce code:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
La sortie attendue est une séquence de nombres pair (0, 2, 4, 6, 8). Cependant, la sortie réelle est de cinq 10s. Cela se produit parce que chaque expression de lambda capture une référence au variable
, pas sa valeur au moment de sa création. Au moment où les lambdas sont invoqués, variable
a déjà atteint sa valeur finale de 10.
La solution: Création d'une copie
Pour corriger cela, nous devons créer une copie de la variable de boucle dans le cadre de chaque expression de lambda:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { int copy = variable; // Create a copy of the variable actions.Add(() => copy * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
Maintenant, chaque expression de Lambda capture sa propre copie indépendante de la valeur de variable
au moment de sa création, produisant la sortie attendue.
C # 5 et Foreach Loops
Il est important de noter que ce comportement est moins préoccupant avec foreach
boucles dans les versions C # 5 et ultérieures. Le compilateur gère la capture variable différemment dans foreach
pour éviter ce problème. Cependant, la méthode de copie explicite reste une meilleure pratique pour la clarté et la compatibilité avec les anciennes versions C #. L'utilisation de cette approche assure un comportement cohérent dans toutes les versions C # et types de boucle.
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!