问题描述
https://www.infoworld.com/article/3182416/c-7-in-depth-exploring-local-functions.html
public static void display(string str)
{
int ctr = 5;
displayText();
void displayText ()
{
for(int i = 0; i < ctr; i++)
Console.WriteLine(str);
}
}
我需要从以前的代码中了解的问题:
- 如果我们调用 main 函数
display()
是否总是在调用 main 函数时生成局部函数displayText()
?或者它在 C# 中创建为一个假的本地函数,但在 MSIL 中它生成为全局函数? - 在lamda表达式中?和上面一样吗?
- 依赖本地函数是否安全?或者我们无论如何都不要使用它。 (性能可能idk)
编辑:-我认为本地属性(尚不存在或可能......)。有时也很有用。您可以在与本地属性相同的方法中进行一些计算。如上一个示例,但 displayText 是属性。希望他们也添加它。
解决方法
CIL 和运行时没有本地函数的概念,而是 C# 编译器将其转换为具有私有可见性的普通方法,并且可能是用于与声明方法共享状态的类/结构。您可以通过编译代码然后反编译程序集或使用诸如 SharpLab.io 之类的网站来亲自查看这一点。
Lambda 表达式和匿名方法非常相似,只是它们需要提供一个可以限制优化机会的委托。
编译器在优化生成的代码方面付出了很多努力,我不希望本地方法对性能的影响远远超过您对任何其他方法的影响。我建议您更多地关注它如何影响可维护性,至少在您可以通过分析确定实际性能问题之前。