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

2022-01-11 14:29:09 字數 1004 閱讀 6172

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時其實你就在用反射(至少你需要它).為了提高效能,我們可以動態建立一些方法來達到我們想要的目的(動態**). (術語有不足之處,希望糾正)

什麼是過載or重寫,二者的區別是?

重寫必須滿足如下條件 1 方法的返回值型別必須相同。2 方法的引數個數必須相同。3 方法的引數對應的資料型別必須相同。4 子類方法不得降低父類同名方法的訪問級別。另外被重寫的方法發生在父類與子類之間 方法名。引數列表,返回值型別相同 重寫的訪問修飾符的許可權一定要大於被重寫的訪問修飾符的許可權 重寫...

4 什麼是crop warp及二者區別聯絡

crop英文意思是裁剪,是直接從影象中截出一部分,保留原影象的真實尺寸比。常見的crop有兩種 1 crop和10 crop。假設原大小為256 256,而規定的大小為224 224 1 crop 在256256這張的中心位置crop出乙個224224大小的區域 10 crop 分別在左上角 右上角...

什麼是反射

反射 可以獲得型別 類,結構,委託,介面和列舉 的成員,包括方法,屬性,建構函式,還可以獲得成員的名稱,限定符和引數,可以直接建立物件。class program stu s2 newstu 元資料 type t s.gettype var ps t.getproperties 屬性 var ms ...