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