6

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

我真的需要确切地知道以下代码应该如何本地函数。

我是 0% IL 代码/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

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

4

1 回答 1

4

CIL 和运行时没有本地函数的概念,而是 C# 编译器将其转换为具有私有可见性的普通方法,并且可能是用于与声明方法共享状态的类/结构。您可以通过编译代码然后反编译程序集或使用诸如SharpLab.io 之类的站点来亲自查看这一点。

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

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

于 2021-03-20T03:16:39.277 回答