C# 何时开始在更高级语言上使用IL

C# 何时开始在更高级语言上使用IL,c#,.net,il,C#,.net,Il,在看到了几个开源项目后,stack exchange团队的大多数人都很喜欢。我注意到有几次他们只是直接编写内联在c#函数中的IL代码 这是一个完美的例子,你可以在一本书中看到 我的猜测是,编译器不会生成被认为是最有效的代码,有时您只需要为编译器生成代码 我的好奇心在于什么时候决定开始使用IL发射器而不是普通的旧C# 我知道这些示例是针对stackexchange的,但我想说的是,其他开发人员必须做出这样的决定。与实际的CPU汇编语言(x86等)相比,NetIL非常简单,几乎所有事情都只有一种方法

在看到了几个开源项目后,stack exchange团队的大多数人都很喜欢。我注意到有几次他们只是直接编写内联在c#函数中的IL代码

这是一个完美的例子,你可以在一本书中看到

我的猜测是,编译器不会生成被认为是最有效的代码,有时您只需要为编译器生成代码

我的好奇心在于什么时候决定开始使用IL发射器而不是普通的旧C#


我知道这些示例是针对stackexchange的,但我想说的是,其他开发人员必须做出这样的决定。与实际的CPU汇编语言(x86等)相比,NetIL非常简单,几乎所有事情都只有一种方法。也就是说,你不能用更好的IL获得更好的性能,因为没有更好的IL。(假设您没有故意生成次优IL,而调试构建就是这样做的。)

.NET性能在很大程度上取决于JIT。无论如何,一种高级语言的整个思想,JIT-ting,GC-ing,等等,。有它的性能代价,所以IL中的轻微优化无论如何都不重要

那么为什么人们使用IL呢?当您生成代码时(比如编译XSLT、正则表达式或动态代理时)。在IL中,这比在字符串缓冲区中创建C#代码并编译要快得多,仅此而已

除了动态生成代码的能力,当IL是必须的时候,我不相信IL还有任何其他优势。C#是一种功能丰富、发展迅速的语言,不使用它简直是疯了。必须在伊利诺伊州工作将是一种惩罚。您可以放心,C#可以编译成尽可能好的IL

您还可以随意使用各种最新的C#功能。我同意,像dynamic这样的东西可能没有最好的性能,但这与性能无关,而是与现代功能有关,这些功能可以帮助您完成任务。我不会给你的。(当然,一些新功能确实有助于提高性能,比如异步,但在更高的级别上,它们的方式与程序集级优化非常不同。)


顺便说一下,恐怕你不能将IL嵌入到C#文件中。除了动态生成新代码外,您无法将IL编译到程序集中,至少在Visual Studio中是这样,除非在使用C#构建程序集后使用某些技巧进行更改。

当情况非常非常糟糕时。希望你永远不会达到这个目标。是的,我想。我只是想看看导致这个决定的基准测试。Dapper使用IL,因为它需要动态地为直到运行时才知道的类型生成代码。你不应该在任何其他情况下使用IL。@CoryNelson你的说法更多是因为C#有很多限制,他们需要通过输入非类型级别来绕过这些限制?如果你使用的是你事先不知道的类型,你可以使用非常慢的反射,也可以通过代码生成来接近本机速度。我想,通过直接编写IL,我的意思是用来发出IL操作码。下面是一个动态生成代码的方法。是的,表达式树非常适合LINQ,比如编译动态谓词。但对于我的例子,特别是对于动态代理,当你必须编译整个类和程序集并实现接口等时,IL是唯一的选择。CIL还有一个优点:一些有效的构造没有C#对应物。在某一点上,我需要的一个特定示例是能够非虚拟地调用非直接基方法(C#pseudo code:
类a{public virtual void f(){}}}类B:a{public override void f(){}}类C:B{public override void f(){a::f();}}
)。通过修改class
B
无法解决这个问题,因为它来自一个设计糟糕的第三方库。