Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么需要发出IL代码?_C#_Il_Intermediate Language - Fatal编程技术网

C# 为什么需要发出IL代码?

C# 为什么需要发出IL代码?,c#,il,intermediate-language,C#,Il,Intermediate Language,我在一个相当大的代码库中工作,今天我发现一个项目在一个普通的类中发出IL-code 包含发出的IL代码的项目是服务定位器的实现 这样做的好处是什么?为什么要这样做与使用C语言相比?通常这样做是为了避免使用反射的开销,只使用运行时可用的信息 然后,您将使用反射来构建一段新的代码,该代码直接处理提供给它的数据,而不使用反射,反射的速度可能会很慢,具体取决于您所做的工作 优点: 演出 缺点: 难以调试 很难弄对 事后难以阅读的代码 陡峭的学习曲线 因此,在开始这项工作之前,你需要确保它确实物有

我在一个相当大的代码库中工作,今天我发现一个项目在一个普通的
类中发出
IL-code

包含发出的IL代码的项目是
服务定位器的实现


这样做的好处是什么?为什么要这样做与使用
C
语言相比?

通常这样做是为了避免使用反射的开销,只使用运行时可用的信息

然后,您将使用反射来构建一段新的代码,该代码直接处理提供给它的数据,而不使用反射,反射的速度可能会很慢,具体取决于您所做的工作

优点:

  • 演出
缺点:

  • 难以调试
  • 很难弄对
  • 事后难以阅读的代码
  • 陡峭的学习曲线
因此,在开始这项工作之前,你需要确保它确实物有所值


请注意,这是一个一般性的答案。在您遇到的特定情况下,无法回答为什么会这样做,也无法回答在没有实际查看代码的情况下会有哪些特定的优点(或缺点)。

这有很多用途。
更常用的场景之一是动态更改/注入代码:


有一个很好的教程可以帮助我理解它的良好用途:



好运取决于。。。白细胞介素代码在做什么?我对白细胞介素的理解非常有限,所以不知道。这是发射白细胞介素的最大问题之一。它需要很多普通程序员没有的知识,只是在事后阅读代码,即使你有这些知识,也很难阅读。如果你想写IL,清除路径是为Stackoverflow使用而创建的SIGIL,它的相关工具位于服务定位器的实现中,因此这可能就是我所说的反射部分。我自己也做过,实现了一个IoC容器,它发出IL来构建对象图。框架代码,可能还可以,应用程序级代码,可能还不行。通过使用表达式树,您通常可以在不存在其他许多问题的情况下获得性能。例如,这些方法都在运行时生成代码,但没有一个显式地构造IL操作码序列。此策略还完全消除了我们在初始测试期间由于引用类型和值类型之间的处理差异而遇到的错误。因此,对于使用服务定位器模式的企业级应用程序,可以降低反射成本,但显然您必须同时考虑其缺点。这正是我的答案是在@LasseV.Karlsen之后