首先来看一下lambda语法:
int someval = 5;
Func<int, int> k = x => x + someval;
someval = 7;
Console.WriteLine(k(3));
//以上代码的输出结果为 10;至于为什么是10可以思考一下,这是理解下面的关键
var values = new List<int> { 10, 20, 30 };
var func = new List<Func<int>>();
//下面这段代码和下面的foreach代码的原理,两段代码等价,
IEnumerator<int> ev = values.GetEnumerator();
while (ev.MoveNext()) {
int v = ev.Current;
func.Add(() => v);
}
//4.0 编译器是在循环外面定义 变量v,代码如下:
IEnumerator<int> ev = values.GetEnumerator();
int z;
while (ev.MoveNext()) {
z = ev.Current;
func.Add(() => z);
}
//foreach 的本质是一个枚举器和一个while循环
foreach (var val in values)
{
//如果不加var v= val 输出结果就是三个:30,30,30;加就变为10,20,30
//以上注释是针对4.0的,如果是c#5.0的话不加,就能输出10,20,30
var v = val;//4.0才需要这句话,这是因为4.0是在循环外面定义循环变量
func.Add(() => v);
}
foreach (var f in func)
{
Console.WriteLine(f());
}
本文探讨了C# 4.0和5.0中使用lambda表达式和闭包在foreach循环中的行为差异。通过示例代码,展示了不同版本下如何捕获和引用循环变量,以及如何影响最终的输出结果。在4.0中,未使用局部变量会导致所有lambda表达式引用相同值,而在5.0中,这种行为得到了修正。
651

被折叠的 条评论
为什么被折叠?



