C# 4.0的主題就是動態(tài)編程(Dynamic Programming)。雖然C#仍然是一種靜態(tài)語言,但是對象的意義開始變得越來越“動態(tài)”。它們的結(jié)構(gòu)和行為無法通過靜態(tài)類型來捕獲,或者至少編譯器在編譯程序時無法得知對象的結(jié)構(gòu)和行為。
C#引入了一種新的靜態(tài)類型”dynamic”,當(dāng)你擁有了一個dynamic類型的對象后,你“對它做的事情”只會在運(yùn)行時進(jìn)行解析。設(shè)想我們擁有這樣兩個類,分別表示兩種飲料:
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類型來表示這兩種飲料。我們寫一個函數(shù)GetDrink(),根據(jù)用戶不同的選擇返回不同的對象。
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#編譯器允許你通過dynamic對象調(diào)用任何方法,即使這個方法根本不存在,編譯器也不會在編譯的時候報編譯錯誤。只有在運(yùn)行的時候,它才會檢查這個對象的實(shí)際類型,并檢查在它上面GetName()是什么意思。動態(tài)類型將使得C#可以以更加統(tǒng)一而便利的形式表示下列對象:
當(dāng)我們得到一個動態(tài)類型的對象時,不管它是來自COM還是IronPython、HTML DOM還是反射,只需要對其進(jìn)行操作即可,動態(tài)語言運(yùn)行時(DLR)會幫我們指出針對特定的對象以及這些操作的具體意義。這將給我們的開發(fā)帶來極大的靈活性,并且能夠極大程度上地精簡我們的代碼。