Maison >développement back-end >C++ >Pourquoi les actions de boucle C # capturent-elles la même variable et comment cela peut-il être évité?
Les variables de la capture du cycle
En C #, lors de la définition de l'opération dans le cycle, assurez-vous de faire attention au comportement de la capture variable. Par défaut, toutes les opérations capturent la même variable, ce qui fait que les résultats de sortie ne respectent pas les appels attendus.
Veuillez considérer l'exemple suivant:
La sortie attendue de ce code est 0, 2, 4, 6 et 8. Cependant, la sortie réelle est de cinq 10. En effet, toutes les opérations citent la même variable capturée
<code class="language-csharp">List<Action> actions = new List<Action>(); int variable = 0; while (variable < 5) { actions.Add(() => Console.WriteLine(variable * 2)); ++variable; } foreach (var act in actions) { act.Invoke(); }</code>, qui est mise à jour dans le cycle. Lors de l'appel, toutes les opérations ont la même valeur 10.
variable
Afin d'éviter ce problème et de vous assurer que chaque instance d'opération a sa propre variable de capture, vous devez copier la variable dans le cycle:
Grâce à la copie locale de la variable, chaque opération capture sa propre valeur unique, afin d'obtenir la sortie attendue 0, 2, 4, 6, 8.
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
Le concept de cette capture variable est essentiel pour comprendre la fermeture de C #. Lorsque vous définissez des opérations dans le cycle, assurez-vous de considérer le cycle de vie de la variable et son accessibilité.
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!