任何人都知道 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);
}
}
我需要从以前的代码中知道这里的问题:
- 如果我们调用主函数
Display()
调用主函数时是否总是生成局部函数 DisplayText()
?或者它在 C# 中创建为伪本地函数但在 MSIL 中它生成为全局函数?
- lamda表达式方法?和上面一样吗?
- 依赖本地函数安全吗?还是我们不应该使用它。 (性能可能idk)
编辑:- 我认为 Local Properties(尚不存在或可能...)。有时也很有用。您可以使用与本地 属性 相同的方法进行一些计算。与前面的示例一样,但 DisplayText 是 属性。希望他们也添加它。
CIL 和运行时没有局部函数的概念,相反,C# 编译器将其转换为具有私有可见性的普通方法,并且可能 class/struct 用于与声明方法共享状态。您可以通过编译代码然后反编译程序集或使用诸如 SharpLab.io.
之类的站点来亲眼看到这一点
Lambda 表达式和匿名方法非常相似,只是它们需要提供一个可以限制优化机会的委托。
编译器在优化生成的代码方面付出了很多努力,我不认为本地方法对性能的影响会超过任何其他方法。我建议您更多地关注它如何影响可维护性,至少在您可以通过分析确定实际性能问题之前。
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);
}
}
我需要从以前的代码中知道这里的问题:
- 如果我们调用主函数
Display()
调用主函数时是否总是生成局部函数DisplayText()
?或者它在 C# 中创建为伪本地函数但在 MSIL 中它生成为全局函数? - lamda表达式方法?和上面一样吗?
- 依赖本地函数安全吗?还是我们不应该使用它。 (性能可能idk)
编辑:- 我认为 Local Properties(尚不存在或可能...)。有时也很有用。您可以使用与本地 属性 相同的方法进行一些计算。与前面的示例一样,但 DisplayText 是 属性。希望他们也添加它。
CIL 和运行时没有局部函数的概念,相反,C# 编译器将其转换为具有私有可见性的普通方法,并且可能 class/struct 用于与声明方法共享状态。您可以通过编译代码然后反编译程序集或使用诸如 SharpLab.io.
之类的站点来亲眼看到这一点Lambda 表达式和匿名方法非常相似,只是它们需要提供一个可以限制优化机会的委托。
编译器在优化生成的代码方面付出了很多努力,我不认为本地方法对性能的影响会超过任何其他方法。我建议您更多地关注它如何影响可维护性,至少在您可以通过分析确定实际性能问题之前。