VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#4.01之Dynamic 3

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  dynamic 关键字还可用于泛型参数。

class MyClass<T>
{
  public T X { get; set; }
}
class Program
{
  static void Main(string[] args)
  {
    dynamic o = new MyClass<dynamic>();
    dynamic a = new { X = 123 };
    o.X = a;
    Console.WriteLine(o.X.X);
  }
}

  嗯,配合匿名类型对象倒是很好用。同样,MyClass<dynamic> 会被编译成 MyClass<object>。

private static void Main(string[] args)
{
  object o = new MyClass<object>();
  object a = new { X = 0x7b };
  ... ...
}

  当然,在泛型集合中也可以方便地使用。

dynamic a = new { X = 123 };
var list = new List<dynamic> { a, "abc" };
dynamic o = list[0];
Console.WriteLine(o.X);
o = list[1];
Console.WriteLine(o);

  既然编译器将 dynamic 替换成 object,那么我们可以用 dynamic 做类型基类吗?

class MyClass : dynamic
{
}

  很遗憾!"Error 'MyClass': cannot derive from the dynamic type"。幸亏不行,否则只怕越搞越乱了。

  至于 dynamic 在委托中的使用和方法没什么区别。

class Program
{
  public delegate dynamic TestHandle(dynamic x);
  static void Main(string[] args)
  {
    TestHandle o = (x) => x;
    Console.WriteLine(o(123));
  }
}

  反编译

public delegate object TestHandle([Dynamic] object x);
private static void Main(string[] args)
{
  TestHandle o = x => x;
  ... ...
} 

  需要说明一下,dynamic 关键字和 3.0 引入的 var 是不同的,尽管从表面上他们都隐藏了实际对象类型。但 var 是编译期行为,也就是说它仅仅是一个有限 block 内的一种 "缩写",编译器会在编译时直接将其替换成实际类型。而 dynamic 实际上对 object 的一种封装,它通过 DLR 在运行期进行 "间接" 访问。因此从功能和实现目标上来说,dynamic 才是对应 javascript var 的一种功能。


相关教程