在堆栈交换团队看到一些开源项目之后.我注意到有几次他们只是在c#函数中直接编写了IL代码.
一个完美的例子,您可以在dapper file中看到.
我的猜测是,编译器不会生成最有效的代码,有时您只需要为编译器执行此操作.
我的好奇心在于何时决定开始使用IL发射器而不是普通的旧C#?
我知道这些例子是针对stackexchange的,但是我猜测其他开发人员必须做出这个决定,因为Sigil存在.
解决方法
与实际的cpu汇编语言(x86等)相比,.NET IL非常简单,只有一种方法可以完成所有操作.意思是,你无法用更好的IL实现更好的性能,因为没有更好的IL. (假设您没有故意生成次优的IL,调试版本会这样做.)
.NET性能在很大程度上取决于JIT-ter.无论如何,高级语言,JIT-ting,GC-ing等的整个想法.它的性能有所收获,因此IL的轻微优化无论如何都无关紧要.
那么人们为什么要使用IL呢?这是在生成代码时(比如编译XSLT,正则表达式或动态代理时).在IL中执行比在字符串缓冲区中创建C#代码并编译它更快,这就是全部.
除了能够动态生成代码之外,当IL是必须的时候,我不相信IL有任何其他优点. C#是一种功能丰富且快速发展的语言,如果不使用它就会疯狂.在IL工作将是一种惩罚.您可以放心,C#可以编译为尽可能好的IL.
您还可以随意使用各种最新的C#功能.我同意,像动态这样的东西可能没有最好的性能,但它不是关于性能,它是关于现代功能,只是帮助你完成工作. IL不会给你这个. (当然,一些新功能确实有助于提高性能,例如异步,但在更高层次上,与组装级优化的方式完全不同.)
顺便说一句,AFAIK你不能将IL嵌入到C#文件中.除了动态生成新代码之外,您无法将IL编译到程序集中,至少不能在Visual Studio中编译,除非某些技巧涉及在使用C#构建后更改程序集.