【发布时间】:2011-08-26 09:51:29
【问题描述】:
我不会问什么是闭包。这是一个闭包: 例如:
List<Func<int>> add = new List<Func<int>>();
List<int> coll = new List<int>(){1,2,3,4,5};
foreach (int i in coll)
{
add.Add(() => i*2);
}
由于闭包关闭了变量,毫无疑问,如果我们尝试调用“add”列表的所有 Func,所有情况的结果都是 10。这让我想,如果这是闭包,那么下面的例子也应该是一个闭包。
//Indirect way of writing the same example
Enumerable.Range(1, 5).ToList().ForEach(x => add.Add(() => x * 2));
这里我们也关闭了变量,所以变量的状态应该是变量的最后一个值,但事实证明,它不是。这不是关闭。 lambda 是否以不可变的方式构造其变量,即一旦我们更改 x 的值,就会创建一个新变量来存储该值?
【问题讨论】:
-
记住,变量是一个存储位置。您不会期望在两次不同的 lambda 调用中形式参数 x 使用相同的存储位置,因为对应于 x 的两个参数可能同时不同。调用方法会为形参和局部变量创建新的存储位置;这些存储位置包含在封闭中。您的第一个示例中的“i”目前只有一个存储位置。 (我们可能会在下一个版本中更改它,因为这是一个常见错误。)
-
我不知道这还会被问多少次......
标签: .net c#-4.0 lambda c#-3.0 foreach