(轉載)【C#4.0】dynamic和var及object

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 關鍵字時,您就告訴編譯器關閉編譯時檢查。對象

 

dynamic a = "test"; a++;

來看看var關鍵字,從C#3.0開始加入的這個,咱們對JavaScript的var比較熟悉,看看C#的var:blog

 

var a = 10; a = a + 1; Console.WriteLine(a.GetType());

此段代碼會輸入 System.Int32, 第二行不須要類型轉換,var是強類型的。當使用 var 關鍵字聲明變量時,將在編譯時根據初始化字符串推斷該變量的類型。 在運行時沒法更改該變量的類型。ip

但要注意的是,var 關鍵字不過是一個指令,它讓編譯器根據變量的初始化表達式推斷類型;var 不是類型。字符串

最後看看object,關鍵字 object 表示 System.Object 類型,它是 C# 類層次結構中的根類型。 此關鍵字常常在編譯時沒法肯定對象類型時使用,而這種狀況常常在各類互操做性情形中發生。get

但用object要避免類型轉換(顯式或隱式)編譯器

 

object a = 10; a = (int)a + 10; a = "test";

Dynamic能夠用來幹嗎?it

發揮你的想象力,我能夠想到的是能夠用來作腳本支持,好比office支持用vba腳本寫插件,那咱們也能夠用這個實現可編寫腳本的應用。

第二個用處就是用動態方法包,動態方法包就是可在運行時添加和刪除屬性及方法的對象。System.Dynamic命名空間其實是 DLR 的一部分,能夠用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 類與新的 dynamic 關鍵字相結合實現本身須要的東東。

第三個用處是替代反射。有個例子,經過反射調用一個計算器對象的Add方法,先前不知道計算器的類型,只知道有個Add方法,代碼是這樣的:

 

object calc = GetCalculator(); Type calcType = calc.GetType(); object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 }); int sum = Convert.ToInt32(res);

如今不用反射用dynamic就代碼簡潔了:

 

dynamic calc = GetCalculator(); int sum = calc.Add(10, 20);

這樣看來Dynamic仍是挺有意思的。

 

var與dynamic這兩個關鍵字,只是看起來很類似,僅此而已!
var
表示「變量的類型是在編譯時決定的」,可是dynamic表 示「變量的類型是在運行時決定的」。所以,dynamicvar具備大相徑庭的含義。
var讓 你在初始化變量時少輸入一些字,編譯器會根據右值來推斷出變量的類型。dynamic更厲害,它告訴編譯器,根本就別理到底是啥類型,運行 時再推斷不遲。
var只能用於局部變量的定義,你不能把類的屬性定義成 var,也不能把方法的返回值類型或者是參 數類型定義成vardynamic就沒有這些侷限了。
dynamic類型並無跳過類型校驗,只是 延遲到了運行時。若是在運行時,檢測到類型不兼容,照樣會拋出異常。

你可能在如下狀況下使用dynamic
1.COM對象
2.動態語言(如IronPython,IronRuby等)對象
3.反射對象
4.C# 4.0中動態建立的對象

 

轉自:http://blog.csdn.net/it_xiaohong/article/details/7249277

相關文章
相關標籤/搜索