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é?

Pourquoi les actions de boucle C # capturent-elles la même variable et comment cela peut-il être évité?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-02-03 07:44:16582parcourir

Why Do C# Loop Actions Capture the Same Variable, and How Can This Be Avoided?

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!

Déclaration:
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