每次调用方法时Func都会编译吗?

时间:2013-10-28 11:56:52

标签: c# func

例如,我有一个带有func的方法:

private void Method()
{
    Func<int, string> myFunc => (int) { return int.ToString();}
    var res = myFunc(42);
}

Func将被编译一次或每次调用方法时?

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

2 个答案:

答案 0 :(得分:5)

看起来你的表情很混乱:

Expression<Func<int, string>> myFuncExpr = someInt => someInt.ToString();

和代表:

Func<int, string> myFunc = someInt => someInt.ToString();

在使用lambdas时,它们具有相似的声明语法,但在调用myFuncExpr.Compile()之前,表达式树将不会编译为委托。每次调用Compile时,编译都会发生,因为表达式树是一种表示代码的方式(特别是C#代码),而不是代码本身。

另一方面,委托将使用程序集中的其余源代码编译一次。从编译器的角度来看,lambda只是声明方法体的另一种方式,即代码本身。所以,没有任何理由以不同的方式编译它。

答案 1 :(得分:4)

这是如何编译的

[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的生命中恰好发生过一次。