1. 程式人生 > >c#動態型別

c#動態型別

動態型別其實是動態編譯的一種形式。在.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關鍵字是在用型別的安全換取程式碼的簡潔度,動態型別並不是必須的,需要根據具體的場景來決定是否使用動態行為。