匿名函数体变量保存在哪里?

时间:2012-05-18 19:29:29

标签: c# anonymous-function anonymous-methods

下面的代码正在运行,但为什么呢?当我在循环中调用匿名方法时,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;
    }

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

有关详细信息,请参阅my blog post