Maison >développement back-end >C++ >Pourquoi les boucles C # avec des variables capturées produisent-elles des résultats inattendus?

Pourquoi les boucles C # avec des variables capturées produisent-elles des résultats inattendus?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-02-03 08:20:10211parcourir

Why Do C# Loops with Captured Variables Produce Unexpected Results?

en -preth discutant du problème de la capture des variables dans le cycle C #

En C #, les développeurs rencontrent un problème intéressant lors de l'utilisation de variables de capture dans l'itération du cycle. Considérez le fragment de code suivant:

Bien que la sortie attendue soit 0, 2, 4, 6 et 8, le code sortit de manière inattendue cinq 10. La raison de ce comportement est les variables capturées
<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)
{
    Console.WriteLine(act.Invoke());
}</code>
. Toutes les opérations citent les mêmes exemples de .

variable Résoudre le problème des variables de capture variable

Afin de surmonter cette limite et de permettre à chaque opération d'avoir ses propres variables de capture, C # fournit une solution simple:

En créant une copie du

dans le cycle, chaque opération capture ses propres exemples seuls, afin de s'assurer que

change en dehors de l'expression de Lambda n'affectera pas la valeur de capture.
<code class="language-csharp">while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}</code>

Autres situations communes variable variable

Ce problème peut également apparaître dans d'autres scénarios impliquant des variables dans le cycle, telles que

et itération:

Dans ces deux cas, la copie locale de la variable est nécessaire pour capturer l'itération du cycle actuel. for foreach Conclusion

<code class="language-csharp">// For loop
for (int i = 0; i < 5; i++)
{
    // ... similar issue ...
}

// Foreach loop
// ... similar issue ...</code>

Comprendre le comportement de la capture des variables dans le cycle C # est essentiel pour éviter les accidents. La solution discutée dans cet article garantit que chaque opération a ses propres variables de capture indépendantes, atteignant ainsi des comportements prévisibles et attendus.

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