dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType());spa
此段代碼會輸出 System.Int32,第二行不須要類型轉換,由於在運行時識別類型。dynamic 在後臺使用 System.Object 類型。但與 object 不一樣的是,動態類型不須要在編譯時執行顯式轉換操做,由於它僅在運行時識別類型。關於dynamic和object的詳細區別,看看《What is the difference between 「dynamic」 and 「object」 keywords?》.net
在 C# 類型系統中,dynamic 其實是一個靜態類型,這個關鍵字使得C# 得到了動態功能,同時仍然做爲靜態類型化語言而存在。這句話如何理解,就要理解它是如何實現動態綁定的,看看《Dynamic Binding in C#4.0》插件
下面的代碼會經過編譯,但運行時報錯。由於當您使用 dynamic 關鍵字時,您就告訴編譯器關閉編譯時檢查。對象
來看看var關鍵字,從C#3.0開始加入的這個,咱們對JavaScript的var比較熟悉,看看C#的var:blog
此段代碼會輸入 System.Int32, 第二行不須要類型轉換,var是強類型的。當使用 var 關鍵字聲明變量時,將在編譯時根據初始化字符串推斷該變量的類型。 在運行時沒法更改該變量的類型。ip
但要注意的是,var 關鍵字不過是一個指令,它讓編譯器根據變量的初始化表達式推斷類型;var 不是類型。字符串
最後看看object,關鍵字 object 表示 System.Object 類型,它是 C# 類層次結構中的根類型。 此關鍵字常常在編譯時沒法肯定對象類型時使用,而這種狀況常常在各類互操做性情形中發生。get
但用object要避免類型轉換(顯式或隱式)編譯器
Dynamic能夠用來幹嗎?it
發揮你的想象力,我能夠想到的是能夠用來作腳本支持,好比office支持用vba腳本寫插件,那咱們也能夠用這個實現可編寫腳本的應用。
第二個用處就是用動態方法包,動態方法包就是可在運行時添加和刪除屬性及方法的對象。System.Dynamic命名空間其實是 DLR 的一部分,能夠用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 類與新的 dynamic 關鍵字相結合實現本身須要的東東。
第三個用處是替代反射。有個例子,經過反射調用一個計算器對象的Add方法,先前不知道計算器的類型,只知道有個Add方法,代碼是這樣的:
如今不用反射用dynamic就代碼簡潔了:
這樣看來Dynamic仍是挺有意思的。
var與dynamic這兩個關鍵字,只是看起來很類似,僅此而已!
var表示「變量的類型是在編譯時決定的」,可是dynamic表 示「變量的類型是在運行時決定的」。所以,dynamic與var具備大相徑庭的含義。
var讓 你在初始化變量時少輸入一些字,編譯器會根據右值來推斷出變量的類型。dynamic更厲害,它告訴編譯器,根本就別理到底是啥類型,運行 時再推斷不遲。
var只能用於局部變量的定義,你不能把類的屬性定義成 var,也不能把方法的返回值類型或者是參 數類型定義成var。dynamic就沒有這些侷限了。
dynamic類型並無跳過類型校驗,只是 延遲到了運行時。若是在運行時,檢測到類型不兼容,照樣會拋出異常。
你可能在如下狀況下使用dynamic:
1.COM對象
2.動態語言(如IronPython,IronRuby等)對象
3.反射對象
4.C# 4.0中動態建立的對象
轉自:http://blog.csdn.net/it_xiaohong/article/details/7249277