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
Libérer: 2025-02-03 08:20:10
original
207 Les gens l'ont consulté

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>
Copier après la connexion
. 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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal