一、動態類型其實是動態編譯的一種形式。在.net4.0上添加新的動態類型dynamic,對於動態類型,就是在運行時才會確定的類型。
1.dynamic關鍵字的使用
1)使用var可以定義本地變量,該變量的實際數據類型取決於編譯時,是在初次分配時確定的,在初次分配后,將擁有一個強類型的變量,任何不相容的的賦值操作都會導致編譯錯誤:
static void Main(string[] args) { var a = new List<int>(); a.Add(90); a = "hello"; }
2)隨着4.0的發布,c#引入一個關鍵字dynamic,我們可以把任何值設置為動態的數據類型,因此可以認為dynamic是一種特殊的System.Object,因此我們現在有三種定義數據的方式,但動態數據不是靜態類型,對於dynamic聲明的數據可以分配任何初始值,並且可以在生命周期中重新分配新的值。
2.調用動態聲明數據的成員
在動態數據后加個.,然后指定公共成員,但是編譯器不會檢查成員的有效性,直到運行時才會檢查成員調用、參數等的有效性。如下代碼:
static void Main(string[] args) { dynamic a = "hello"; Console.WriteLine(a.ToUpper()); Console.WriteLine(a.toupper()); Console.WriteLine(a.Foo(10,DateTime.Now)); }
除此之外,調用動態數據的成員時VS不會獲取智能提示,而強類型可以。
3.MicroSoft.CSharp.dll的作用
在VS創建新的項目的時候,將自動引入MicroSoft.CSharp.dll程序集,這個程序集包含MicroSoft.CSharp.RuntimeBinder命名空間和兩個類:RuntimeBinderException和RuntimeBinderInternalCompilerException,如果試圖調用一個不存在的動態數據的成員或者調用了一個存在的成員且錯誤的參數數據時,將會拋出RuntimeBinderException。
由於動態數據的不確定性,可以在調用成員時通過try catch來進行包裹。
4.dynamic關鍵字的作用域
用var聲明的數據只能作為一個成員范圍內的本地變量,不能用於返回值、參數和類成員, 但對於dynamic來說可以實現。
5.dynamic關鍵字的限制
在調用一個動態數據的方法時,不能使用Lambda表達式和c#匿名方法。另外一個是,dynamic聲明的數據不能用於Linq技術。
6.dynamic關鍵字的實際用途
在某些場景中,dynamic關鍵字可以減少手工輸入的代碼量,特別是一個大量使用后期綁定(通過反射)的.net應用程序,使用dynamic關鍵字是在用類型的安全換取代碼的簡潔度,動態類型並不是必須的,需要根據具體的場景來決定是否使用動態行為。
二、DLR
DLR(動態語言運行時)隨着.net 4.0一起發布,作為CLR的補充運行時環境,DLR的作用之一是使不同的動態語言能在.net運行時運行,最常用的是IronPython和IronRuby。