在很久之前,我寫了一片文章詳解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吧。
10年的祿豐網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整祿豐建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“祿豐網(wǎng)站設(shè)計(jì)”,“祿豐網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。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)用場景需求。