每次调用方法时,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 次或每次调用方法?

如果您有这样的链接,也请分享一些链接,因为这是一种争论

每次调用方法时,Func 是否编译

看起来你正在混淆表达式:

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的一生中只发生一次。