淺析C# Dynamic關(guān)鍵字
dynamic關(guān)鍵字和動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)是.Net 4.0中新增的功能。
什么是"動(dòng)態(tài)"?
編程語(yǔ)言有時(shí)可以劃分為靜態(tài)類(lèi)型化語(yǔ)言和動(dòng)態(tài)類(lèi)型化語(yǔ)言。C#和Java經(jīng)常被認(rèn)為是靜態(tài)化類(lèi)型的語(yǔ)言,而Python、Ruby和JavaScript是動(dòng)態(tài)類(lèi)型語(yǔ)言。
一般而言,動(dòng)態(tài)語(yǔ)言在編譯時(shí)不會(huì)對(duì)類(lèi)型進(jìn)行檢查,而是在運(yùn)行時(shí)識(shí)別對(duì)象的類(lèi)型。這種方法有利有弊:代碼編寫(xiě)起來(lái)更快、更容易,但無(wú)法獲取編譯器錯(cuò)誤,只能通過(guò)單元測(cè)試和其他方法來(lái)確保應(yīng)用正常運(yùn)行。
C#最初是作為純靜態(tài)語(yǔ)言創(chuàng)建的,但是C#4添加了一些動(dòng)態(tài)元素,用于改進(jìn)與動(dòng)態(tài)語(yǔ)言和框架之間的互操作性。C# 團(tuán)隊(duì)考慮了多種設(shè)計(jì)選項(xiàng),但最終確定添加一個(gè)新關(guān)鍵字來(lái)支持這些功能:dynamic。
dynamic關(guān)鍵字可充當(dāng)C#類(lèi)型系統(tǒng)中的靜態(tài)類(lèi)型聲明。這樣,C#就獲得了動(dòng)態(tài)功能,同時(shí)仍然作為靜態(tài)類(lèi)型化語(yǔ)言而存在。
由于編譯時(shí)不會(huì)去檢查類(lèi)型,所以導(dǎo)致IDE的IntellSense失效。
dynamic、Object還是Var?
那么,dynamic、Object和var之間的實(shí)際區(qū)別是什么?何時(shí)使用它們?
先說(shuō)說(shuō)var,經(jīng)常有人會(huì)拿dynamic和var進(jìn)行比較。實(shí)際上,var和dynamic完全是兩個(gè)概念,根本不應(yīng)該放在一起做比較。
var實(shí)際上編譯器拋給我們的語(yǔ)法糖,一旦被編譯,編譯器就會(huì)自動(dòng)匹配var變量的實(shí)際類(lèi)型,并用實(shí)際類(lèi)型來(lái)替換該變量的聲明,等同于我們?cè)诰幋a時(shí)使用了實(shí)際類(lèi)型聲明。而dynamic被編譯后是一個(gè)Object類(lèi)型,編譯器編譯時(shí)不會(huì)對(duì)dynamic進(jìn)行類(lèi)型檢查。
再說(shuō)說(shuō)Object,上面提到dynamic類(lèi)型再編譯后是一個(gè)Object類(lèi)型,同樣是Object類(lèi)型,那么兩者的區(qū)別是什么呢?
除了在編譯時(shí)是否進(jìn)行類(lèi)型檢查之外,另外一個(gè)重要的區(qū)別就是類(lèi)型轉(zhuǎn)化,這也是dynamic很有價(jià)值的地方,dynamic類(lèi)型的實(shí)例和其他類(lèi)型的實(shí)例間的轉(zhuǎn)換是很簡(jiǎn)單的,開(kāi)發(fā)人員能夠很方便地在dyanmic和非dynamic行為間切換。任何實(shí)例都能隱式轉(zhuǎn)換為dynamic類(lèi)型實(shí)例,見(jiàn)下面的例子:
dynamic d1 = 7; dynamic d2 = "a string"; dynamic d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
反之亦然,類(lèi)型為dynamic的任何表達(dá)式也能夠隱式轉(zhuǎn)換為其他類(lèi)型。
int i = d1; string str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4;
dynamic與反射
以前我們這樣使用反射:
public class DynamicSample
{
public string Name { get; set; }
public int Add(int a, int b)
{
return a + b;
}
}
DynamicSample dynamicSample = new DynamicSample();
//create instance為了簡(jiǎn)化演示,我沒(méi)有使用反射
var addMethod = typeof(DynamicSample).GetMethod("Add");
int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
現(xiàn)在,我們有了簡(jiǎn)化的寫(xiě)法:
dynamic dynamicSample2 = new DynamicSample(); int re2 = dynamicSample2.Add(1, 2);
我們可能會(huì)對(duì)這樣的簡(jiǎn)化不以為然,畢竟看起來(lái)代碼并沒(méi)有減少多少,此方法也不能使用 IntelliSense,但是,如果考慮到效率兼優(yōu)美兩個(gè)特性,那么dynamic的優(yōu)勢(shì)就顯現(xiàn)出來(lái)了。編譯器對(duì)dynamic進(jìn)行了優(yōu)化,比沒(méi)有經(jīng)過(guò)緩存的反射效率快了很多。
以上就是淺析C# Dynamic關(guān)鍵字的詳細(xì)內(nèi)容,更多關(guān)于C# Dynamic關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- c# dynamic的好處
- c#中object、var和dynamic的區(qū)別小結(jié)
- c#使用dynamic類(lèi)型優(yōu)化反射的方法
- 深入淺析C#中的var和dynamic
- C#使用dynamic類(lèi)型訪問(wèn)JObject對(duì)象
- 詳解C# 匿名對(duì)象(匿名類(lèi)型)、var、動(dòng)態(tài)類(lèi)型 dynamic
- C# 反射與dynamic最佳組合示例代碼
- C#動(dòng)態(tài)對(duì)象(dynamic)詳解(實(shí)現(xiàn)方法和屬性的動(dòng)態(tài))
- C#中Dynamic和Dictionary性能比較
- c# dynamic的使用詳解
相關(guān)文章
比較2個(gè)datatable內(nèi)容是否相同的方法
這篇文章主要介紹了比較2個(gè)datatable內(nèi)容是否相同的方法,大家參考使用吧2014-01-01
詳解C#如何利用爬蟲(chóng)技術(shù)實(shí)現(xiàn)快捷租房
做為一個(gè)碼農(nóng),大部分都集中在一二線城市,所以租房也就無(wú)可避免,面對(duì)如今五花八門(mén)的租房信息,往往很難找到合適的房子。本文教你如何利用爬蟲(chóng)技術(shù)實(shí)現(xiàn)快捷租房,感興趣的可以了解一下2022-09-09
C#利用deskew算法實(shí)現(xiàn)圖像文本傾斜校正
這篇文章主要為大家詳細(xì)介紹了C#如何利用deskew算法實(shí)現(xiàn)圖像文本傾斜校正,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類(lèi)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類(lèi),實(shí)例分析了C#抓取及分析網(wǎng)頁(yè)中文本及連接的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05

