Dynamic和Var的差別及dynamic應用詳解。本站提示廣大學習愛好者:(Dynamic和Var的差別及dynamic應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Dynamic和Var的差別及dynamic應用詳解正文
C#中的許多症結詞用法比擬輕易混雜,var和dynamic就是個中一組,他們都可以聲名靜態類型的變量,然則實質上他們照樣有很多差別的。var 在編譯階段曾經肯定類型,在初始化時刻,必需供給初始化的值,而dynamic則可以不供給,它是在運轉時才肯定類型。
1.var聲明一個部分變量只是一種簡化語法,它請求編譯器依據一個表達式揣摸詳細的數據類型。
2.var只能用於聲明辦法外部的部分變量,而dynamic可用於部分變量,字段,參數。
3.表達式不克不及轉型為var,但能轉型為dynamic。
4.必需顯式初始化用var聲明的變量,但無需初始化用dynam聲明的變量。
//var 在編譯階段曾經肯定類型 // var varError; var isIntType = ; isIntType.ToString(); //dynamic在編譯時代不停止任何 //的類型檢討,而是將類型檢討放到 //了運轉期 dynamic dyn = ; // dynamic dynOk; dyn = "hello world"; //error 字符串沒有 [ fn不存在的辦法 ] 的辦法 //但在語法檢討時經由過程,不會提醒語法毛病 var s = dyn.fn不存在的辦法();//runtime error
因為dynamic在運轉時才檢討類型,所以有時刻會湧現毛病,是以應用它必需得法,那末什麼時候應用它比擬便利呢?我們先界說一個Person類,然後用反射停止靜態挪用起Talk辦法:
class Person { public void Talk(string msg) { MessageBox.Show(msg); } }
//dynamic 在反射時刻可以簡化代碼 System.Type t = typeof(Person); var obj = Activator.CreateInstance(t, null); t.InvokeMember("Talk", System.Reflection.BindingFlags.InvokeMethod, null, obj, new object[] { "hell world!" });
在反射的時刻,傳統的辦法的辦法挪用常常比擬繁瑣,而用dyanmic則異常簡化,並且直不雅:
dynamic obj = Activator.CreateInstance(t, null); obj.Talk("hell world!");
是以,dynamic只需應用得法,照樣一個C#一個異常好的特點。
最初給年夜家總結以下:
常有人會拿var這個症結字來和dynamic做比擬。現實上,var和dynamic完整是兩個概念,基本不該該放在一路做 比擬。var現實上是編譯期拋給我們的“語法糖”,一旦被編譯,編譯期會主動婚配var 變量的現實類型,並用現實類型來調換該變量的聲名,這看上去就似乎我們在編碼的時刻是用現實類型停止聲名的。而dynamic被編譯後,現實是一個 object類型,只不外編譯器會對dynamic類型停止特別處置,讓它在編譯時代不停止任何的類型檢討,而是將類型檢討放到了運轉期。
這從visual studio的編纂器窗口就可以看出來。以var聲明的變量,支撐“智能感知”,由於visual studion能揣摸出var類型的現實類型,而以dynamic聲明的變量卻不支撐“智能感知”,由於編譯器對其運轉期的類型一竅不通。對 dynamic變量應用“智能感知”,會提醒“此操作將在運轉時解析”。