什么是Emit,什么是反射,两者区别究竟是什么?(转)

Emit的准肯定义,咱们看看微软给出的答案
System.Reflection.Emit 命名空间包含{

容许编译器或工具发出元数据发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘上生成 PE 文件的类。安全

这些类的主要客户端是脚本引擎和编译器。工具

}性能

 

 

Emit能够直接让编译器发出元数据及msil,这样作的优点又是什么?
MSIL是将.NET代码转化为 机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时, 编译器源代码翻译成Microsoft  中间语言 (MSIL),它是一组能够有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.

 

因此,咱们的.NET程序最终都是以这些中间语言存储起来的,在运行后,又由即时编译器直接转换成真正的机器语言执行. emit这种优点在于能够在程序动态运行的过程当中,直接生成IL运行(可谓灵活且不失高效)ui

 

 

 

反射的原理及性能问题引用Jeffrey Richter的一段话:  元数据是用一系列的表来存储的.生成一个程序集或模块时,编译器会建立一个类型定义表、一个字段定义表、一个方法定义表以及其余表.利用反射命名空间(sytem.reflection,因此可知emit是其一个附属,不是独立的)中包含的一些类型,能够用代码来解析(就是所谓的反射)这些元数据表.

 

反射有两个缺点:1.反射没法在编译期间保证类型的安全;2.反射速度慢.(咱们须要使用sytem.reflection命名空间中的类型扫描程序集的元数据,反射要不断地执行字符串的搜索) spa

 

 

 

总结反射包含emit,反射性能低缘由在于须要扫描程序集或模块的元数据表.emit性能高,在于可以动态生成msil当即执行.它们各据其位,因此用emit时其实你就在用反射(至少你须要它).为了提升性能,咱们能够动态建立一些方法来达到咱们想要的目的(动态代理).

 (术语有不足之处,但愿纠正)翻译