内联匿名方法吗?

时间:2016-10-21 12:43:10

标签: .net inline anonymous-methods

首先,这不是这个问题的愚蠢:

Are anonymous methods defined inline?

我认为提问者正在提出另一个问题。

我正在询问方法内联,在编译过程中,对方法的调用被方法的实际替换。

我对匿名方法的理解是它们实际上使用编译器指定的名称编译为具体方法。这样做是为了减少堆栈开销。编译匿名方法时,它们内联的方法是否相同?

1 个答案:

答案 0 :(得分:0)

匿名方法的工作方式与普通方法完全相同 - 如果JIT编译器决定内联它们,则可以内联它们。

但是,最有可能的是,您没有直接调用匿名方法 - 您正在调用指向匿名方法的委托。在这种情况下,与任何其他委托调用一样,编译器不能内联任何内容,因为它在编译时(或JIT时间)不知道实际将要调用哪个方法。

我猜你对.NET中的泛型工作方式感到困惑,而不是明确的匿名方法,特别是与C ++的模板形成对比 - 例如,如果我在C#中collection.Select(i => i.SomeProperty),那么仍然只有一种方法{{ 1}} [1];当有其他Select调用将不同函数作为参数时,你将如何内联i => i.SomeProperty方法?相反,在C ++中使用模板允许内联“函数”参数,因为模板只是编译时代码生成功能;在C ++中使用类似的Select模板会给你一个单独的代码,不涉及方法调用。

毋庸置疑,这只是一个实现细节。通过假装它不是委托并且内联Select方法本身,对未来的编译器内联方法调用是有效的。

[1] - 从技术上讲,在JIT编译期间,可能有多个版本的Select方法用于不同的类型参数 - 但这与这种情况无关;对于每一个可能的论点,它仍然没有采用不同的方法。