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#可以以更加统一而便利的形式表示下列对象:
来自动态编程语言——如Python或Ruby——的对象
通过IDispatch访问的COM对象
通过反射访问的一般.NET类型
结构发生过变化的对象——如HTML DOM对象
当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象以及这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。