任何人都知道 IL/CLR 是如何生成局部函数 C#7

Any one know how exactly IL/CLR generates Local Functions C#7

https://www.infoworld.com/article/3182416/c-7-in-depth-exploring-local-functions.html

我真的需要确切地知道下面的代码局部函数应该是怎样的。

0% IL Code/MSIL 经验。

  public static void Display(string str)
    {
        int ctr = 5;
        DisplayText();

        void DisplayText ()
        {
            for(int i = 0; i < ctr; i++)
            Console.WriteLine(str);
        }
    }

我需要从以前的代码中知道这里的问题:

  1. 如果我们调用主函数 Display() 调用主函数时是否总是生成局部函数 DisplayText()?或者它在 C# 中创建为伪本地函数但在 MSIL 中它生成为全局函数?
  2. lamda表达式方法?和上面一样吗?
  3. 依赖本地函数安全吗?还是我们不应该使用它。 (性能可能idk

编辑:- 我认为 Local Properties(尚不存在或可能...)。有时也很有用。您可以使用与本地 属性 相同的方法进行一些计算。与前面的示例一样,但 DisplayText 是 属性。希望他们也添加它。

CIL 和运行时没有局部函数的概念,相反,C# 编译器将其转换为具有私有可见性的普通方法,并且可能 class/struct 用于与声明方法共享状态。您可以通过编译代码然后反编译程序集或使用诸如 SharpLab.io.

之类的站点来亲眼看到这一点

Lambda 表达式和匿名方法非常相似,只是它们需要提供一个可以限制优化机会的委托。

编译器在优化生成的代码方面付出了很多努力,我不认为本地方法对性能的影响会超过任何其他方法。我建议您更多地关注它如何影响可维护性,至少在您可以通过分析确定实际性能问题之前。