1

下面的代码可以工作,但为什么?当我在循环中调用匿名方法时,x 和 y 在哪里来/保存。

谢谢

    static void Main(string[] args)
    {
        int x=1;
        int y=2;
        var dic = GetDic(x, y);

        for (int i = 0; i < 5;i++ )
        {
            System.Console.WriteLine(dic[i].Invoke().ToString());
        }

    }

    private static Dictionary<int, Func<int>> GetDic(int x, int y)
    {
        var dic = new Dictionary<int, Func<int>>()
        {
            {0,()=>{return y;}},
            {1,()=>{return x;}},
            {2,()=>{return x+y;}},
            {3,()=>{return x-y;}},
            {4,()=>{return y-x;}},
        };
        return dic;
    }
4

2 回答 2

3

Lambda 表达式被编译成单独的方法。如果它们不使用周围代码中的局部变量,它们将被编译为同一类的方法。但是,当使用局部变量时(如本例所示),编译器会在周围类型中创建一个嵌套类,并将与使用的局部变量匹配的编译方法和字段放在那里。使用 lambda 表达式时,会创建该类的实例,并将值存储在实例字段中,以便 lambda 方法可以访问它们。

这也意味着在 lambda 表达式中使用来自周围方法的局部变量比仅使用其参数和其他类型的静态成员的 lambda 表达式稍微贵一些。

于 2012-05-18T19:36:08.897 回答
1

它们保存在代表Target字段中生成的闭包类中。

有关详细信息,请参阅我的博客文章

于 2012-05-18T19:32:12.823 回答