什么是Emit,什么是反射,二者區別到底是什么?


Emit的准確定義,我們看看微軟給出的答案
System.Reflection.Emit 命名空間包含{

允許編譯器或工具發出元數據發出 Microsoft 中間語言 (MSIL) ,並可選擇在磁盤上生成 PE 文件的類。

這些類的主要客戶端是腳本引擎和編譯器。

}

 

 

Emit可以直接讓編譯器發出元數據及msil,這樣做的優勢又是什么?
MSIL是將.NET代碼轉化為 機器語言的一個中間過程。它是一種介於高級語言和基於Intel的匯編語言的偽匯編語言。當用戶編譯一個.NET程序時, 編譯器源代碼翻譯成Microsoft 中間語言 (MSIL),它是一組可以有效地轉換為本機代碼且獨立於CPU的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化為CPU特定的代碼.

 

所以,我們的.NET程序最終都是以這些中間語言存儲起來的,在運行后,又由即時編譯器直接轉換成真正的機器語言執行. emit這種優勢在於可以在程序動態運行的過程中,直接生成IL運行(可謂靈活且不失高效)

 

 

 

反射的原理及性能問題引用Jeffrey Richter的一段話: 元數據是用一系列的表來存儲的.生成一個程序集或模塊時,編譯器會創建一個類型定義表、一個字段定義表、一個方法定義表以及其他表.利用反射命名空間(sytem.reflection,所以可知emit是其一個附屬,不是獨立的)中包含的一些類型,可以用代碼來解析(就是所謂的反射)這些元數據表.


反射有兩個缺點:1.反射無法在編譯期間保證類型的安全;2.反射速度慢.(我們需要使用sytem.reflection命名空間中的類型掃描程序集的元數據,反射要不斷地執行字符串的搜索)

 

 

 

總結反射包含emit,反射性能低原因在於需要掃描程序集或模塊的元數據表.emit性能高,在於能夠動態生成msil立即執行.它們各據其位,所以用emit時其實你就在用反射(至少你需要它).為了提高性能,我們可以動態創建一些方法來達到我們想要的目的(動態代理).
 (術語有不足之處,希望糾正)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM