1

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

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

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

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

4

2 回答 2

5

看起来你在混淆表达式:

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

和代表:

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

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

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

于 2013-10-28T12:07:35.233 回答
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 的生命中只发生一次。

于 2013-10-28T12:02:13.510 回答