Dynamic和Var的區(qū)別及dynamic使用詳解
C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的。var 在編譯階段已經(jīng)確定類型,在初始化時候,必須提供初始化的值,而dynamic則可以不提供,它是在運行時才確定類型。
1.var聲明一個局部變量只是一種簡化語法,它要求編譯器根據(jù)一個表達式推斷具體的數(shù)據(jù)類型。
2.var只能用于聲明方法內(nèi)部的局部變量,而dynamic可用于局部變量,字段,參數(shù)。
3.表達式不能轉(zhuǎn)型為var,但能轉(zhuǎn)型為dynamic。
4.必須顯式初始化用var聲明的變量,但無需初始化用dynam聲明的變量。
//var 在編譯階段已經(jīng)確定類型 // var varError; var isIntType = ; isIntType.ToString(); //dynamic在編譯期間不進行任何 //的類型檢查,而是將類型檢查放到 //了運行期 dynamic dyn = ; // dynamic dynOk; dyn = "hello world"; //error 字符串沒有 [ fn不存在的方法 ] 的方法 //但在語法檢查時通過,不會提示語法錯誤 var s = dyn.fn不存在的方法();//runtime error
由于dynamic在運行時才檢查類型,所以有時候會出現(xiàn)錯誤,因此使用它必須得法,那么何時使用它比較方便呢?我們先定義一個Person類,然后用反射進行動態(tài)調(diào)用起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!" });
在反射的時候,傳統(tǒng)的方法的方法調(diào)用往往比較繁瑣,而用dyanmic則非常簡化,而且直觀:
dynamic obj = Activator.CreateInstance(t, null); obj.Talk("hell world!");
因此,dynamic只要使用得法,還是一個C#一個非常好的特征。
最后給大家總結(jié)以下:
常有人會拿var這個關(guān)鍵字來和dynamic做比較。實際上,var和dynamic完全是兩個概念,根本不應(yīng)該放在一起做 比較。var實際上是編譯期拋給我們的“語法糖”,一旦被編譯,編譯期會自動匹配var 變量的實際類型,并用實際類型來替換該變量的申明,這看上去就好像我們在編碼的時候是用實際類型進行申明的。而dynamic被編譯后,實際是一個 object類型,只不過編譯器會對dynamic類型進行特殊處理,讓它在編譯期間不進行任何的類型檢查,而是將類型檢查放到了運行期。
這從visual studio的編輯器窗口就能看出來。以var聲明的變量,支持“智能感知”,因為visual studion能推斷出var類型的實際類型,而以dynamic聲明的變量卻不支持“智能感知”,因為編譯器對其運行期的類型一無所知。對 dynamic變量使用“智能感知”,會提示“此操作將在運行時解析”。
上一篇:實例詳解C#正則表達式
欄 目:C#教程
下一篇:詳解C#編程中一維數(shù)組與多維數(shù)組的使用
本文標(biāo)題:Dynamic和Var的區(qū)別及dynamic使用詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6755.html
您可能感興趣的文章
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#及WPF獲取本機所有字體和顏色的方法
- 01-10同步調(diào)用和異步調(diào)用WebService
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運算符和表達式
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#編程自學(xué)之類和對象
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法