来自深度的C#
static void Main()
{
// First build a list of actions
List<Action> actions = new List<Action>();
for (int counter = 0; counter < 10; counter++)
{
actions.Add(() => Console.WriteLine(counter));
}
// Then execute them
foreach (Action action in actions)
{
action();
}
}
这将打印10 10 10 ...
static void Main()
{
// First build a list of actions
List<Action> actions = new List<Action>();
for (int counter = 0; counter < 10; counter++)
{
int copy = counter;
actions.Add(() => Console.WriteLine(copy));
}
// Then execute them
foreach (Action action in actions)
{
action();
}
}
这将打印10 9 8 ..
我不明白为什么
答案 0 :(得分:0)
表达式使用变量,计数器或副本,具体取决于使用的是上面的代码段,它是在表达式之外定义的,因此它由委托捕获。
在第一个示例中,所有人都捕获了相同的counter
,并且在调用它们时,该变量的值为10,因此它们都打印出来。
在第二个中,每次都会创建一个单独的变量,该变量由委托捕获。由于之后没有任何内容改变copy
的值,因此它们各自具有从0到9的不同值。