C# 4.0的主題就是動(dòng)態(tài)編程(Dynamic Programming)。雖然C#仍然是一種靜態(tài)語(yǔ)言,但是對(duì)象的意義開始變得越來(lái)越“動(dòng)態(tài)”。它們的結(jié)構(gòu)和行為無(wú)法通過(guò)靜態(tài)類型來(lái)捕獲,或者至少編譯器在編譯程序時(shí)無(wú)法得知對(duì)象的結(jié)構(gòu)和行為。
C#引入了一種新的靜態(tài)類型”dynamic”,當(dāng)你擁有了一個(gè)dynamic類型的對(duì)象后,你“對(duì)它做的事情”只會(huì)在運(yùn)行時(shí)進(jìn)行解析。設(shè)想我們擁有這樣兩個(gè)類,分別表示兩種飲料:
public class Coffee { public string GetName() { return "You selected Maxwell coffee."; } } public class Juice { public string GetName() { return "You selected orange juice."; } }
現(xiàn)在,我們就可以用dynamic類型來(lái)表示這兩種飲料。我們寫一個(gè)函數(shù)GetDrink(),根據(jù)用戶不同的選擇返回不同的對(duì)象。
static private Object GetDrink(int i) { if (i == 1) { return new Juice(); } else // default { return new Coffee(); } } static void Main(string[] args) { Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee"); int nDrinkType = Console.Read(); dynamic drink = GetDrink( nDrinkType ); Console.WriteLine( drink.GetName() ); }
C#編譯器允許你通過(guò)dynamic對(duì)象調(diào)用任何方法,即使這個(gè)方法根本不存在,編譯器也不會(huì)在編譯的時(shí)候報(bào)編譯錯(cuò)誤。只有在運(yùn)行的時(shí)候,它才會(huì)檢查這個(gè)對(duì)象的實(shí)際類型,并檢查在它上面GetName()是什么意思。動(dòng)態(tài)類型將使得C#可以以更加統(tǒng)一而便利的形式表示下列對(duì)象:
- 來(lái)自動(dòng)態(tài)編程語(yǔ)言——如Python或Ruby——的對(duì)象
- 通過(guò)IDispatch訪問(wèn)的COM對(duì)象
- 通過(guò)反射訪問(wèn)的一般.NET類型
- 結(jié)構(gòu)發(fā)生過(guò)變化的對(duì)象——如HTML DOM對(duì)象
當(dāng)我們得到一個(gè)動(dòng)態(tài)類型的對(duì)象時(shí),不管它是來(lái)自COM還是IronPython、HTML DOM還是反射,只需要對(duì)其進(jìn)行操作即可,動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)會(huì)幫我們指出針對(duì)特定的對(duì)象以及這些操作的具體意義。這將給我們的開發(fā)帶來(lái)極大的靈活性,并且能夠極大程度上地精簡(jiǎn)我們的代碼。
本文鏈接:http://www.95time.cn/tech/program/2010/7540.asp
出處:IT168
責(zé)任編輯:bluehearts
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|