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)化語(yǔ)法,它要求編譯器根據(jù)一個(gè)表達(dá)式推斷具體的數(shù)據(jù)類型。
2.var只能用于聲明方法內(nèi)部的局部變量,而dynamic可用于局部變量,字段,參數(shù)。
3.表達(dá)式不能轉(zhuǎn)型為var,但能轉(zhuǎn)型為dynamic。
4.必須顯式初始化用var聲明的變量,但無(wú)需初始化用dynam聲明的變量。
//var 在編譯階段已經(jīng)確定類型 // var varError; var isIntType = ; isIntType.ToString(); //dynamic在編譯期間不進(jìn)行任何 //的類型檢查,而是將類型檢查放到 //了運(yùn)行期 dynamic dyn = ; // dynamic dynOk; dyn = "hello world"; //error 字符串沒(méi)有 [ fn不存在的方法 ] 的方法 //但在語(yǔ)法檢查時(shí)通過(guò),不會(huì)提示語(yǔ)法錯(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)鍵字來(lái)和dynamic做比較。實(shí)際上,var和dynamic完全是兩個(gè)概念,根本不應(yīng)該放在一起做 比較。var實(shí)際上是編譯期拋給我們的“語(yǔ)法糖”,一旦被編譯,編譯期會(huì)自動(dòng)匹配var 變量的實(shí)際類型,并用實(shí)際類型來(lái)替換該變量的申明,這看上去就好像我們?cè)诰幋a的時(shí)候是用實(shí)際類型進(jìn)行申明的。而dynamic被編譯后,實(shí)際是一個(gè) object類型,只不過(guò)編譯器會(huì)對(duì)dynamic類型進(jìn)行特殊處理,讓它在編譯期間不進(jìn)行任何的類型檢查,而是將類型檢查放到了運(yùn)行期。
這從visual studio的編輯器窗口就能看出來(lái)。以var聲明的變量,支持“智能感知”,因?yàn)関isual studion能推斷出var類型的實(shí)際類型,而以dynamic聲明的變量卻不支持“智能感知”,因?yàn)榫幾g器對(duì)其運(yùn)行期的類型一無(wú)所知。對(duì) dynamic變量使用“智能感知”,會(huì)提示“此操作將在運(yùn)行時(shí)解析”。
相關(guān)文章
C#多線程之Thread中Thread.IsAlive屬性用法分析
這篇文章主要介紹了C#多線程之Thread中Thread.IsAlive屬性用法,實(shí)例分析了C#判斷線程可用狀態(tài)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
在WCF數(shù)據(jù)訪問(wèn)中使用緩存提高Winform字段中文顯示速度的方法
這篇文章主要介紹了在WCF數(shù)據(jù)訪問(wèn)中使用緩存提高Winform字段中文顯示速度的方法,是非常實(shí)用的功能,需要的朋友可以參考下2014-09-09
使用C#語(yǔ)言實(shí)現(xiàn)的查詢條件界面展開(kāi)和收起功能
這篇文章主要介紹了使用C#語(yǔ)言實(shí)現(xiàn)的查詢條件界面展開(kāi)和收起功能的完美解決方案,需要的朋友可以參考下2016-11-11

