每次调用方法时,Func 是否编译
本文关键字:Func 是否 编译 调用 方法 | 更新日期: 2023-09-27 18:37:18
例如,我有一个包含func的方法:
private void Method()
{
Func<int, string> myFunc => (int) { return int.ToString();}
var res = myFunc(42);
}
Func 将被编译 1 次或每次调用方法?
如果您有这样的链接,也请分享一些链接,因为这是一种争论
看起来你正在混淆表达式:
Expression<Func<int, string>> myFuncExpr = someInt => someInt.ToString();
和代表:
Func<int, string> myFunc = someInt => someInt.ToString();
使用 lambda 时,它们具有类似的声明语法,但在您调用 myFuncExpr.Compile()
之前,表达式树不会编译为委托。每次调用 Compile
时,都会进行编译,因为表达式树是一种表示代码(特别是 C# 代码)的方式,而不是代码本身。
另一方面,委托将使用程序集中的其余源代码编译一次。从编译器的角度来看,这里的lambda只是声明方法体的另一种方式,即代码本身。因此,没有任何理由以某种方式对其进行编译。
这就是它的编译方式
[CompilerGenerated]
private static Func<int, string> CS$<>9__CachedAnonymousMethodDelegate1;
private void Method()
{
Func<int, string> myFunc = (CS$<>9__CachedAnonymousMethodDelegate1 != null) ? CS$<>9__CachedAnonymousMethodDelegate1 : (CS$<>9__CachedAnonymousMethodDelegate1 = new Func<int, string>(Program.<Method>b__0));
string res = myFunc(0x2a);
}
所以很明显,它只创建一次并存储在静态字段中。
另请注意,即使这是实例方法委托也是静态的。因此,它在AppDomain的一生中只发生一次。