在 C# 中将 Lambda 表达式与迭代器结合使用
在 C# 中,lambda 表达式提供了一种简洁便捷的方式来定义匿名函数。然而,将 lambda 表达式与迭代器结合使用时的一个常见陷阱是捕获的变量不是迭代器变量的当前值,而是最终值。
请考虑以下代码:
<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>
当您执行此代码时,您可能期望它打印以下输出:
Hi String Hi Single Hi Int32
但是,实际输出是:
Hi Int32 Hi Int32 Hi Int32
这是因为 lambda 表达式捕获循环变量类型,而不是定义 lambda 时的值。因此,当执行 lambda 时,它使用类型的最终值,即 Int32。
要解决此问题并获得所需的输出,可以使用局部变量来捕获迭代器的当前值变量,如以下代码所示:
<code class="c#">foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }</code>
在这种情况下,lambda 表达式捕获局部变量 newType,该变量被赋予 type 的当前值。这可确保 lambda 表达式在执行时使用正确的类型值。
以上是为什么 Lambda 表达式捕获 C# 中迭代器变量的最终值?的详细内容。更多信息请关注PHP中文网其他相关文章!