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

标签 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;
    }

最佳答案

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

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

关于c# - 匿名函数体变量保存在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10658658/

相关文章:

c# - 如何从匿名定义的事件处理程序中提取 "real"目标?

c# - 如何使用匿名方法动态订阅事件?

java - 解决错误 'can not resolve symbol'

c# - import_type 尝试调用全局

c# - 将 ObservableCollection 绑定(bind)到 ItemsControl - 并不像听起来那么简单?

c# - 转换问题

haskell - 匿名函数中的参数

javascript - 在循环中附加事件 (IE 7)

c# - ClickOnce 部署 "Activation failed"FileNotFoundException

Javascript匿名函数错误