淺析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)類型化語(yǔ)言和動(dòng)態(tài)類型化語(yǔ)言。C#和Java經(jīng)常被認(rèn)為是靜態(tài)化類型的語(yǔ)言,而Python、Ruby和JavaScript是動(dòng)態(tài)類型語(yǔ)言。
一般而言,動(dòng)態(tài)語(yǔ)言在編譯時(shí)不會(huì)對(duì)類型進(jìn)行檢查,而是在運(yùn)行時(shí)識(shí)別對(duì)象的類型。這種方法有利有弊:代碼編寫(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#類型系統(tǒng)中的靜態(tài)類型聲明。這樣,C#就獲得了動(dòng)態(tài)功能,同時(shí)仍然作為靜態(tài)類型化語(yǔ)言而存在。
由于編譯時(shí)不會(huì)去檢查類型,所以導(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í)際類型,并用實(shí)際類型來(lái)替換該變量的聲明,等同于我們?cè)诰幋a時(shí)使用了實(shí)際類型聲明。而dynamic被編譯后是一個(gè)Object類型,編譯器編譯時(shí)不會(huì)對(duì)dynamic進(jìn)行類型檢查。
再說(shuō)說(shuō)Object,上面提到dynamic類型再編譯后是一個(gè)Object類型,同樣是Object類型,那么兩者的區(qū)別是什么呢?
除了在編譯時(shí)是否進(jìn)行類型檢查之外,另外一個(gè)重要的區(qū)別就是類型轉(zhuǎn)化,這也是dynamic很有價(jià)值的地方,dynamic類型的實(shí)例和其他類型的實(shí)例間的轉(zhuǎn)換是很簡(jiǎn)單的,開(kāi)發(fā)人員能夠很方便地在dyanmic和非dynamic行為間切換。任何實(shí)例都能隱式轉(zhuǎn)換為dynamic類型實(shí)例,見(jiàn)下面的例子:
dynamic d1 = 7; dynamic d2 = "a string"; dynamic d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses();
反之亦然,類型為dynamic的任何表達(dá)式也能夠隱式轉(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為了簡(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類型優(yōu)化反射的方法
- 深入淺析C#中的var和dynamic
- C#使用dynamic類型訪問(wèn)JObject對(duì)象
- 詳解C# 匿名對(duì)象(匿名類型)、var、動(dòng)態(tà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)文章
C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作
這篇文章主要介紹了C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02使用WPF實(shí)現(xiàn)加載動(dòng)畫(huà)效果
在應(yīng)用程序加載大量數(shù)據(jù)或執(zhí)行復(fù)雜操作時(shí),為用戶提供一個(gè)良好的加載體驗(yàn)變得至關(guān)重要,加載動(dòng)畫(huà)是其中一個(gè)有效的方式,下面我們就來(lái)看看如何使用WPF實(shí)現(xiàn)簡(jiǎn)單的加載動(dòng)畫(huà)效果吧2024-03-03WPF實(shí)現(xiàn)自定義Panel面板的示例詳解
WPF中的Panel(面板),是繼承自FrameworkElement的抽象類,表示一個(gè)可以用來(lái)排列子元素的面板,本文主要來(lái)和大家聊聊WPF如何實(shí)現(xiàn)自定義Panel,感興趣的可以了解下2023-09-09C#調(diào)用百度翻譯API實(shí)現(xiàn)一個(gè)翻譯功能
一直喜歡用Google Translate API進(jìn)行在線翻譯,但是服務(wù)越來(lái)越慢這篇文章,所以只能換一個(gè)了,主要給大家介紹了關(guān)于C#調(diào)用百度翻譯API實(shí)現(xiàn)一個(gè)翻譯功能的相關(guān)資料,需要的朋友可以參考下2021-06-06