Maison > développement back-end > C++ > Pourquoi les expressions C # Lambda dans les boucles capturent-elles la valeur variable finale, et comment peut-elle être réparée?

Pourquoi les expressions C # Lambda dans les boucles capturent-elles la valeur variable finale, et comment peut-elle être réparée?

Barbara Streisand
Libérer: 2025-02-03 08:10:09
original
794 Les gens l'ont consulté

Why Do C# Lambda Expressions in Loops Capture the Final Variable Value, and How Can This Be Fixed?

Comprendre C # Capture de variable d'expression Lambda dans les boucles

Un problème fréquent dans la programmation C # implique des expressions de lambda dans des boucles. La façon dont les expressions de lambda capturent les variables peuvent conduire à des résultats inattendus. Explorons ce problème et sa solution.

Considérez ce code:

<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 10)
{
    actions.Add(() => variable * 2);
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>
Copier après la connexion

La sortie attendue est une séquence de nombres pair (0, 2, 4, 6, 8). Cependant, la sortie réelle est de cinq 10s. Cela se produit parce que chaque expression de lambda capture une référence au variable, pas sa valeur au moment de sa création. Au moment où les lambdas sont invoqués, variable a déjà atteint sa valeur finale de 10.

La solution: Création d'une copie

Pour corriger cela, nous devons créer une copie de la variable de boucle dans le cadre de chaque expression de lambda:

<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 10)
{
    int copy = variable; // Create a copy of the variable
    actions.Add(() => copy * 2); 
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>
Copier après la connexion

Maintenant, chaque expression de Lambda capture sa propre copie indépendante de la valeur de variable au moment de sa création, produisant la sortie attendue.

C # 5 et Foreach Loops

Il est important de noter que ce comportement est moins préoccupant avec foreach boucles dans les versions C # 5 et ultérieures. Le compilateur gère la capture variable différemment dans foreach pour éviter ce problème. Cependant, la méthode de copie explicite reste une meilleure pratique pour la clarté et la compatibilité avec les anciennes versions C #. L'utilisation de cette approche assure un comportement cohérent dans toutes les versions C # et types de boucle.

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