標籤:
http://www.cnblogs.com/Mainz/archive/2011/03/10/1980060.html
1: dynamic a = 10;
2: a = a + 10;
3: Console.WriteLine(a.GetType());
此段代碼會輸出 System.Int32,第二行不需要類型轉換,因為在運行時識別類型。dynamic 在後台使用 System.Object 類型。但與 object 不同的是,動態類型不需要在編譯時間執行顯式轉換操作,因為它僅在運行時識別類型。關於dynamic和object的詳細區別,看看《What is the difference between “dynamic” and “object” keywords?》
在 C# 類型系統中,dynamic 實際上是一個靜態類型,這個關鍵字使得C# 獲得了動態功能,同時仍然作為靜態類型化語言而存在。這句話如何理解,就要理解它是如何?動態綁定的,看看《Dynamic Binding in C#4.0》
下面的代碼會通過編譯,但運行時報錯。因為當您使用 dynamic 關鍵字時,您就告訴編譯器關閉編譯時間檢查。
1: dynamic a = "test";
2: a++;
來看看var關鍵字,從C#3.0開始加入的這個,我們對JavaScript的var比較熟悉,看看C#的var:
1: var a = 10;
2: a = a + 1;
3: Console.WriteLine(a.GetType());
此段代碼會輸入 System.Int32, 第二行不需要類型轉換,var是強型別的。當使用 var 關鍵字聲明變數時,將在編譯時間根據初始化字串推斷該變數的類型。 在運行時無法更改該變數的類型。
但要注意的是,var 關鍵字不過是一個指令,它讓編譯器根據變數的初始設定式推斷類型;var 不是類型。
最後看看object,關鍵字 object 表示 System.Object 類型,它是 C# 類階層中的根類型。 此關鍵字經常在編譯時間無法確定物件類型時使用,而這種情況經常在各種互通性情形中發生。
但用object要避免類型轉換(顯式或隱式)
1: object a = 10;
2: a = (int)a + 10;
3: a = "test";
Dynamic可以用來幹嘛?
發揮你的想象力,我可以想到的是可以用來做指令碼支援,比如office支援用vba指令碼寫外掛程式,那我們也可以用這個實現可編寫指令碼的應用。
第二個用處就是用動態方法包,動態方法包就是可在運行時添加和刪除屬性及方法的對象。System.Dynamic命名空間實際上是 DLR 的一部分,可以用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 類與新的 dynamic 關鍵字相結合實現自己需要的東東。
第三個用處是替代反射。有個例子,通過反射調用一個計算機對象的Add方法,先前不知道計算機的類型,只知道有個Add方法,代碼是這樣的:
1: object calc = GetCalculator();
2: Type calcType = calc.GetType();
3: object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 });
4: int sum = Convert.ToInt32(res);
現在不用反射用dynamic就代碼簡潔了:
1: dynamic calc = GetCalculator();
2: int sum = calc.Add(10, 20);
這樣看來Dynamic還是挺有意思的。
(轉)C#4.0的dynamic和var及object關鍵字辨析