淺析C# Dynamic關(guān)鍵字
dynamic關(guān)鍵字和動態(tài)語言運行時(DLR)是.Net 4.0中新增的功能。
什么是"動態(tài)"?
編程語言有時可以劃分為靜態(tài)類型化語言和動態(tài)類型化語言。C#和Java經(jīng)常被認為是靜態(tài)化類型的語言,而Python、Ruby和JavaScript是動態(tài)類型語言。
一般而言,動態(tài)語言在編譯時不會對類型進行檢查,而是在運行時識別對象的類型。這種方法有利有弊:代碼編寫起來更快、更容易,但無法獲取編譯器錯誤,只能通過單元測試和其他方法來確保應(yīng)用正常運行。
C#最初是作為純靜態(tài)語言創(chuàng)建的,但是C#4添加了一些動態(tài)元素,用于改進與動態(tài)語言和框架之間的互操作性。C# 團隊考慮了多種設(shè)計選項,但最終確定添加一個新關(guān)鍵字來支持這些功能:dynamic。
dynamic關(guān)鍵字可充當C#類型系統(tǒng)中的靜態(tài)類型聲明。這樣,C#就獲得了動態(tài)功能,同時仍然作為靜態(tài)類型化語言而存在。
由于編譯時不會去檢查類型,所以導(dǎo)致IDE的IntellSense失效。
dynamic、Object還是Var?
那么,dynamic、Object和var之間的實際區(qū)別是什么?何時使用它們?
先說說var,經(jīng)常有人會拿dynamic和var進行比較。實際上,var和dynamic完全是兩個概念,根本不應(yīng)該放在一起做比較。
var實際上編譯器拋給我們的語法糖,一旦被編譯,編譯器就會自動匹配var變量的實際類型,并用實際類型來替換該變量的聲明,等同于我們在編碼時使用了實際類型聲明。而dynamic被編譯后是一個Object類型,編譯器編譯時不會對dynamic進行類型檢查。
再說說Object,上面提到dynamic類型再編譯后是一個Object類型,同樣是Object類型,那么兩者的區(qū)別是什么呢?
除了在編譯時是否進行類型檢查之外,另外一個重要的區(qū)別就是類型轉(zhuǎn)化,這也是dynamic很有價值的地方,dynamic類型的實例和其他類型的實例間的轉(zhuǎn)換是很簡單的,開發(fā)人員能夠很方便地在dyanmic和非dynamic行為間切換。任何實例都能隱式轉(zhuǎn)換為dynamic類型實例,見下面的例子:
dynamic d1 = 7; dynamic d2 = "a string"; dynamic d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
反之亦然,類型為dynamic的任何表達式也能夠隱式轉(zhuǎn)換為其他類型。
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為了簡化演示,我沒有使用反射 var addMethod = typeof(DynamicSample).GetMethod("Add"); int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
現(xiàn)在,我們有了簡化的寫法:
dynamic dynamicSample2 = new DynamicSample(); int re2 = dynamicSample2.Add(1, 2);
我們可能會對這樣的簡化不以為然,畢竟看起來代碼并沒有減少多少,此方法也不能使用 IntelliSense,但是,如果考慮到效率兼優(yōu)美兩個特性,那么dynamic的優(yōu)勢就顯現(xiàn)出來了。編譯器對dynamic進行了優(yōu)化,比沒有經(jīng)過緩存的反射效率快了很多。
以上就是淺析C# Dynamic關(guān)鍵字的詳細內(nèi)容,更多關(guān)于C# Dynamic關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#調(diào)用百度翻譯API實現(xiàn)一個翻譯功能
一直喜歡用Google Translate API進行在線翻譯,但是服務(wù)越來越慢這篇文章,所以只能換一個了,主要給大家介紹了關(guān)于C#調(diào)用百度翻譯API實現(xiàn)一個翻譯功能的相關(guān)資料,需要的朋友可以參考下2021-06-06