C# 4.0中的动态类型和动态编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 4.0中的动态类型和动态编程相关的知识,希望对你有一定的参考价值。

# 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)会帮我们指出针对特定的对象以及这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。
 
0

以上是关于C# 4.0中的动态类型和动态编程的主要内容,如果未能解决你的问题,请参考以下文章

C#4.0中的更改——动态绑定

.net 4.0 中的特性总结:dynamic

.NET 4.0 中的新“动态”变量类型是不是解决了 CLR 中的单/多方法分派问题?

是否可以动态编译和执行 C# 代码片段?

VB 2010 中的 Object 是不是获得了与 C# 4.0 中的动态相同的优化?

在 .NET 4.0 (C#) 中动态实现接口