在很久之前,我寫了一片文章詳解C# 匿名對(duì)象(匿名類型)、var、動(dòng)態(tài)類型 dynamic,可以借鑒。因?yàn)槟菚r(shí)候是心中想當(dāng)然的認(rèn)為只有反射能夠在運(yùn)行時(shí)解析對(duì)象的成員信息并調(diào)用成員方法。后來也是因?yàn)槠渌氖乱恢倍紱]有回過頭來把這一節(jié)知識(shí)給補(bǔ)上,正所謂亡羊補(bǔ)牢,讓我們現(xiàn)在來大致了解一下DLR吧。
DLR 全稱是 Dynamic Language Runtime(動(dòng)態(tài)語言運(yùn)行時(shí))。這很容易讓我們想到同在C#中還有一個(gè)叫 CLR 的東西,它叫 Common Language Runtime。那這兩者有什么關(guān)系呢?這個(gè)后續(xù)再說
C#4動(dòng)態(tài)功能是Dynamic Language Runtime(動(dòng)態(tài)語言運(yùn)行時(shí),DLR)的一部分.DLR是添加到CLR的一系列服務(wù),它允許添加動(dòng)態(tài)語言,如Ruby和Python,并使C#具備和這些動(dòng)態(tài)語言相同的某些功能.
DLR 是 C#4.0 新引進(jìn)來的概念,其主要目的就是為了動(dòng)態(tài)綁定與交互。
C#關(guān)鍵字 dynamic
DLR 首先定義了一個(gè)核心類型概念,即動(dòng)態(tài)類型。即在運(yùn)行時(shí)確定的類型,動(dòng)態(tài)類型的成員信息、方法等都只在運(yùn)行時(shí)進(jìn)行綁定。與CLR的靜態(tài)類型相反,靜態(tài)類型都是在C#編譯期間通過一系列的規(guī)則匹配到最后的綁定。
將這種動(dòng)態(tài)進(jìn)行綁定的過程它有點(diǎn)類似反射,但其內(nèi)部卻和反射有很大的不同。這個(gè)稍微會(huì)談到。
由動(dòng)態(tài)類型構(gòu)成的對(duì)象叫動(dòng)態(tài)對(duì)象。
DLR一般有下列特點(diǎn):
dynamic
。如dynamic x = GetReturnAnyCLRType()
DLR發(fā)展到現(xiàn)在,我們幾乎都使用了動(dòng)態(tài)類型關(guān)鍵字 dynamic
以及還有引用DLR的類庫 Dapper等。
在我們不想創(chuàng)建新的靜態(tài)類做DTO映射時(shí),我們第一時(shí)間會(huì)想到動(dòng)態(tài)類型。也經(jīng)常性的將dynamic作為參數(shù)使用。
這時(shí)候我們就要注意一些 dynamic 不為大多人知的一些細(xì)節(jié)了。
不是只要含有 dynamic 的表達(dá)式都是動(dòng)態(tài)的。
什么意思呢,且看這段代碼dynamic x = "marson shine";
。這句代碼很簡單,就是將字符串賦值給動(dòng)態(tài)類型 x。
大家不要以為這就是動(dòng)態(tài)類型了哦,其實(shí)不是,如果單單只是這一句的話,C#編譯器在編譯期間是會(huì)把變量 x 轉(zhuǎn)變成靜態(tài)類型 object 的,等價(jià)于object x = "marson shine";
??赡苡行┤藭?huì)驚訝,為什么C#編譯器最后會(huì)生成object類型的代碼。這就是接下來我們要注意的。
dynamic 于 object 的不可告人的關(guān)系
其實(shí)如果你是以 dynamic 類型為參數(shù),那么實(shí)際上它就是等于 object 類型的。換句話說,dynamic在CLR級(jí)別就是object。其實(shí)這點(diǎn)不用記,我們從編譯器生成的C#代碼就知道了。
這里我用的是dotpeek查看編譯器生成的c#代碼。
這里順便想問下各位,有沒有mac下c#反編譯的工具。求推薦
所以我們?cè)趯懼剌d方法時(shí),是不能以 object 和 dynamic 來區(qū)分的。
void DynamicMethod(object o); void DynamicMethod(dynamic d); // error 編譯器無法通過編譯:已經(jīng)存在同名同形參的方法
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。