例如,我有一个内部带有 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 的生命中只发生一次。