Couvrir la variable dans le cycle: un problème étrange
Lorsque vous utilisez le cycle C #, vous pouvez rencontrer un problème spécial pour capturer des variables. Considérons les scènes suivantes:
Contrairement à attendu, ce code imprime cinq "10" au lieu de la séquence attendue 0, 2, 4, 6, 8.
<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>
Question: La variable de capture dans le cycle
Toutes les fonctions lambda créées dans le cycle capturent la même variable . Par conséquent, lorsque ces fonctions sont appelées à l'extérieur, elles citent toutes la valeur finale de
.
variable
Solution: copier le sauvetage variable
Afin de résoudre ce problème, vous devez créer une copie de la variable dans le cycle, puis la capturer dans chaque fonction lambda:
En créant une copie, chaque fermeture créée dans le cycle capturera sa propre valeur unique, générant ainsi la sortie attendue.
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
variable
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!