我偶然发现了这篇文章,觉得非常有趣,于是我进行了一些测试:
测试一:
List<Action> actions = new List<Action>();
for (int i = 0; i < 5; ++i)
actions.Add(() => Console.WriteLine(i));
foreach (Action action in actions)
action();
输出:
5
5
5
5
5
第二个测试:
List<Action> actions = new List<Action>();
for (int i = 0; i < 5; ++i)
{
int j = i;
actions.Add(() => Console.WriteLine(j));
}
foreach (Action action in actions)
action();
输出:
0
1
2
3
4
根据这篇文章,在Test One中,所有的lambda表达式都包含对 i 的引用,这导致它们都输出5。那么这是否意味着在Test Two中我会得到预期的结果,因为每个lambda表达式都创建了一个新的 int ?
i
赋值给j
,所以lambda捕获了对j
的新引用-第二个测试的结果符合预期。我手头没有Jon Skeet的C#深度,所以无法参考他关于在lambda中捕获变量的信息。我记得他确实详细介绍了在lambda中捕获值的一些细节。 - IAbstract