解释如何编译lambdas

时间:2016-11-19 14:46:02

标签: c#

来自深度的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 ..

我不明白为什么

1 个答案:

答案 0 :(得分:0)

表达式使用变量,计数器或副本,具体取决于使用的是上面的代码段,它是在表达式之外定义的,因此它由委托捕获。

在第一个示例中,所有人都捕获了相同的counter,并且在调用它们时,该变量的值为10,因此它们都打印出来。

在第二个中,每次都会创建一个单独的变量,该变量由委托捕获。由于之后没有任何内容改变copy的值,因此它们各自具有从0到9的不同值。