【问题标题】:Where does anonymous function body variables saved ?匿名函数体变量保存在哪里?
【发布时间】:2012-05-18 19:29:29
【问题描述】:

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

【问题讨论】:

    标签: c# anonymous-function anonymous-methods


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 2021-03-17
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多