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>
Lorsque vous exécutez ce code, vous pouvez vous attendre à ce qu'il imprime le résultat suivant :
Hi String Hi Single Hi Int32
Cependant, le résultat réel est :
Hi Int32 Hi Int32 Hi Int32
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>
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!