例如,我有一个带有func的方法:
private void Method()
{
Func<int, string> myFunc => (int) { return int.ToString();}
var res = myFunc(42);
}
Func将被编译一次或每次调用方法时?
如果你有这样的话,请分享一些链接,因为这是一种争论
答案 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的生命中恰好发生过一次。