動(dòng)態(tài)編程語言主要的弱點(diǎn)有兩個(gè):
(1)代碼中的許多錯(cuò)誤要等到運(yùn)行時(shí)才能發(fā)現(xiàn),而且需要特定的運(yùn)行環(huán)境支持,對(duì)其進(jìn)行測(cè)試不太方便,也不支持許多用于提升代碼質(zhì)量的各種軟件工程工具,因此不太適合于開發(fā)規(guī)模較大的、包容復(fù)雜處理邏輯的應(yīng)用系統(tǒng)。
(2)與靜態(tài)編程語言相比,動(dòng)態(tài)編程語言編寫的程序性能較低。不過隨著計(jì)算機(jī)軟硬件技術(shù)的不斷進(jìn)步,比如多核CPU的廣泛應(yīng)用,動(dòng)態(tài)編程語言引擎和運(yùn)行環(huán)境不斷地優(yōu)化,動(dòng)態(tài)編程語言編寫的程序性能在不斷地提升,在特定的應(yīng)用場(chǎng)景下,甚至可以逼近靜態(tài)語言編寫的程序。
2 擁抱“動(dòng)態(tài)編程”特性的C# 4
為了讓C#、Visual Basic等.NET編程語言能具備動(dòng)態(tài)編程語言的特性,.NET 4.0引入了一個(gè)“DLR(Dynamic Language Runtime:動(dòng)態(tài)語言運(yùn)行時(shí))”(圖 3)。
圖3 DLR:動(dòng)態(tài)語言運(yùn)行時(shí)
DLR運(yùn)行于CLR之上,提供了一個(gè)動(dòng)態(tài)語言的運(yùn)行環(huán)境,從而允許Python、Ruby等動(dòng)態(tài)語言編寫的程序在.NET平臺(tái)上運(yùn)行,同時(shí),現(xiàn)有的.NET靜態(tài)類型編程語言,比如C#和Visual Basic,也可以利用DLR而擁有一些動(dòng)態(tài)編程語言的特性。
(1)使用C# 4編寫動(dòng)態(tài)的代碼
C# 4新增了一個(gè)dynamic關(guān)鍵字,可以用它來編寫“動(dòng)態(tài)”的代碼。
例如,以下代碼創(chuàng)建了一個(gè)ExpandoObject對(duì)象(注意必須定義為dynamic):
dynamic dynamicObj = new ExpandoObject();
這一對(duì)象的奇特之處在于,我們可以隨時(shí)給它增加新成員:
dynamicObj.Value = 100; //添加字段 dynamicObj.Increment = new Action(() => dynamicObj.Value++); //添加方法
這些動(dòng)態(tài)添加的成員與普通的類成員用法一樣:
for (int i = 0; i < 10; i++) dynamicObj.Increment();//調(diào)用方法 Console.WriteLine("dynamicObj.Value={0}",dynamicObj.Value);//訪問字段
ExpandoObject對(duì)象實(shí)現(xiàn)了IDictionary<string, object>接口,可看成是一個(gè)字典對(duì)象,所有動(dòng)態(tài)添加的成員都是這個(gè)字典對(duì)象中的元素,這意味我們不僅可以添加新成員,還可以隨時(shí)移除不再需要的成員:
//移除Increment方法 (dynamicObj as IDictionary<string, object>).Remove("Increment"); 方法移除之后,再嘗試訪問此方法將引發(fā)RuntimeBinderException異常。
出處:CSDN
責(zé)任編輯:bluehearts
上一頁 拓展動(dòng)態(tài)編程的新領(lǐng)域 [1] 下一頁 拓展動(dòng)態(tài)編程的新領(lǐng)域 [3]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|