在C#中运行时内联?

关于C#的几个问题

  1. C#是否支持运行时内联?
  2. JIT在执行代码之前或期间是否进行了优化?
  3. 虚拟函数可以内联吗?

C#语言没有内联,但.NET CLR JIT编译器可以。

虚拟可能在密封类中是内联的,但我不确定非密封类。 我不会假设。

在首次调用函数时,JIT在执行代码之前进行优化。 因为在JIT开始工作之前,您没有任何代码可以执行。 :P JIT只在第一次调用函数时发生一次,而不是在每次调用函数时发生。

另请注意,内联仅在程序集(DLL)中完成。 JIT编译器不会从另一个程序集复制代码以将其内联到此程序集的代码中。

C#不支持任何内联。 JIT编译器可以在优化时在舞台后面进行一些内联​​。

C#编译器本身不进行内联(可以通过在Reflector中打开程序集来validation)。 CLR的JIT编译器进行内联,这里有一篇关于这个主题的博客文章 (还有更多内容)。

请注意,通常,.NET编译器不能跨DLL边界进行内联,因为DLL可以编译依赖于DLL的代码更改。 因此,在运行时进行内联是有意义的。