Maison > développement back-end > C++ > Pourquoi les expressions Lambda capturent-elles la valeur finale des variables d'itérateur en C# ?

Pourquoi les expressions Lambda capturent-elles la valeur finale des variables d'itérateur en C# ?

Barbara Streisand
Libérer: 2024-10-29 11:02:02
original
718 Les gens l'ont consulté

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

Utilisation d'expressions Lambda avec des itérateurs en C#

En C#, les expressions lambda offrent un moyen concis et pratique de définir des fonctions anonymes. Cependant, un piège courant lors de l'utilisation d'expressions lambda avec des itérateurs est que la variable capturée n'est pas la valeur actuelle de la variable itérateur, mais plutôt la valeur finale.

Considérez le code suivant :

<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) };
List<PrintHelloType> helloMethods = new List<PrintHelloType>();

foreach (var type in types)
{
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
    helloMethods.Add(sayHello);
}

foreach (var helloMethod in helloMethods)
{
    Console.WriteLine(helloMethod("Hi"));
}</code>
Copier après la connexion

Lorsque vous exécutez ce code, vous pouvez vous attendre à ce qu'il imprime le résultat suivant :

Hi String
Hi Single
Hi Int32
Copier après la connexion

Cependant, le résultat réel est :

Hi Int32
Hi Int32
Hi Int32
Copier après la connexion

C'est parce que l'expression lambda capture le type de variable de boucle, pas sa valeur au moment où le lambda est défini. Par conséquent, lorsque le lambda est exécuté, il utilise la valeur finale du type, qui est Int32.

Pour résoudre ce problème et obtenir le résultat souhaité, vous pouvez utiliser une variable locale pour capturer la valeur actuelle de l'itérateur. variable, comme indiqué dans le code suivant :

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>
Copier après la connexion

Dans ce cas, l'expression lambda capture la variable locale newType, à laquelle est attribuée la valeur actuelle de type. Cela garantit que l'expression lambda utilise la valeur de type correcte lors de son exécution.

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