Dynamic和Var的區(qū)別及dynamic使用詳解
C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動(dòng)態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的。var 在編譯階段已經(jīng)確定類型,在初始化時(shí)候,必須提供初始化的值,而dynamic則可以不提供,它是在運(yùn)行時(shí)才確定類型。
1.var聲明一個(gè)局部變量只是一種簡(jiǎn)化語法,它要求編譯器根據(jù)一個(gè)表達(dá)式推斷具體的數(shù)據(jù)類型。
2.var只能用于聲明方法內(nèi)部的局部變量,而dynamic可用于局部變量,字段,參數(shù)。
3.表達(dá)式不能轉(zhuǎn)型為var,但能轉(zhuǎn)型為dynamic。
4.必須顯式初始化用var聲明的變量,但無需初始化用dynam聲明的變量。
//var 在編譯階段已經(jīng)確定類型 // var varError; var isIntType = ; isIntType.ToString(); //dynamic在編譯期間不進(jìn)行任何 //的類型檢查,而是將類型檢查放到 //了運(yùn)行期 dynamic dyn = ; // dynamic dynOk; dyn = "hello world"; //error 字符串沒有 [ fn不存在的方法 ] 的方法 //但在語法檢查時(shí)通過,不會(huì)提示語法錯(cuò)誤 var s = dyn.fn不存在的方法();//runtime error
由于dynamic在運(yùn)行時(shí)才檢查類型,所以有時(shí)候會(huì)出現(xiàn)錯(cuò)誤,因此使用它必須得法,那么何時(shí)使用它比較方便呢?我們先定義一個(gè)Person類,然后用反射進(jìn)行動(dòng)態(tài)調(diào)用起Talk方法:
class Person
{
public void Talk(string msg)
{
MessageBox.Show(msg);
}
}
//dynamic 在反射時(shí)候可以簡(jiǎn)化代碼
System.Type t = typeof(Person);
var obj = Activator.CreateInstance(t, null);
t.InvokeMember("Talk", System.Reflection.BindingFlags.InvokeMethod, null, obj, new object[] { "hell world!" });
在反射的時(shí)候,傳統(tǒng)的方法的方法調(diào)用往往比較繁瑣,而用dyanmic則非常簡(jiǎn)化,而且直觀:
dynamic obj = Activator.CreateInstance(t, null);
obj.Talk("hell world!");
因此,dynamic只要使用得法,還是一個(gè)C#一個(gè)非常好的特征。
最后給大家總結(jié)以下:
常有人會(huì)拿var這個(gè)關(guān)鍵字來和dynamic做比較。實(shí)際上,var和dynamic完全是兩個(gè)概念,根本不應(yīng)該放在一起做 比較。var實(shí)際上是編譯期拋給我們的“語法糖”,一旦被編譯,編譯期會(huì)自動(dòng)匹配var 變量的實(shí)際類型,并用實(shí)際類型來替換該變量的申明,這看上去就好像我們?cè)诰幋a的時(shí)候是用實(shí)際類型進(jìn)行申明的。而dynamic被編譯后,實(shí)際是一個(gè) object類型,只不過編譯器會(huì)對(duì)dynamic類型進(jìn)行特殊處理,讓它在編譯期間不進(jìn)行任何的類型檢查,而是將類型檢查放到了運(yùn)行期。
這從visual studio的編輯器窗口就能看出來。以var聲明的變量,支持“智能感知”,因?yàn)関isual studion能推斷出var類型的實(shí)際類型,而以dynamic聲明的變量卻不支持“智能感知”,因?yàn)榫幾g器對(duì)其運(yùn)行期的類型一無所知。對(duì) dynamic變量使用“智能感知”,會(huì)提示“此操作將在運(yùn)行時(shí)解析”。
相關(guān)文章
C# Color.FromArgb()及系統(tǒng)顏色對(duì)照表一覽
這篇文章主要介紹了C# Color.FromArgb()及系統(tǒng)顏色對(duì)照表一覽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
WPF實(shí)現(xiàn)背景燈光隨鼠標(biāo)閃動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)背景燈光隨鼠標(biāo)閃動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
C#使用Stack<T>進(jìn)行堆棧設(shè)計(jì)的實(shí)現(xiàn)
堆棧代表了一個(gè)后進(jìn)先出的對(duì)象集合,當(dāng)您需要對(duì)各項(xiàng)進(jìn)行后進(jìn)先出的訪問時(shí),則使用堆棧,本文主要介紹了C#使用Stack<T>類進(jìn)行堆棧設(shè)計(jì)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),感興趣的可以了解一下2024-03-03
c#檢測(cè)usb設(shè)備撥插類庫USBClassLibrary分享
這篇文章主要介紹了c#檢測(cè)usb設(shè)備撥插類庫USBClassLibrary的簡(jiǎn)單示例,需要的朋友可以參考下2014-04-04
C#匿名委托和Java匿名局部?jī)?nèi)部類使用方法示例
Java在嵌套類型這里提供的特性比較多,假設(shè):Java的字節(jié)碼只支持靜態(tài)嵌套類,內(nèi)部類、局部?jī)?nèi)部類和匿名局部?jī)?nèi)部類都是編譯器提供的語法糖,這個(gè)假設(shè)目前沒法驗(yàn)證(看不懂字節(jié)碼),本文先來看一下C#是如何為我們提供的這種語法糖2013-11-11
C#12中的Collection expressions集合表達(dá)式語法糖詳解
C#12中引入了新的語法糖來創(chuàng)建常見的集合,并且可以使用..來解構(gòu)集合,將其內(nèi)聯(lián)到另一個(gè)集合中,下面就跟隨小編一起學(xué)習(xí)一下C#12中這些語法糖的使用吧2023-11-11
C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置實(shí)例
這篇文章主要介紹了C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置實(shí)例,對(duì)C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置的實(shí)現(xiàn)方法與具體代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以參考下2014-10-10
詳解如何將.NET應(yīng)用轉(zhuǎn)換成Window服務(wù)
這篇文章主要為大家詳細(xì)介紹了如何將.NET8.0應(yīng)用程序轉(zhuǎn)換成Windows服務(wù),文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

