WEB开发网
开发学院软件开发C语言 [C# 4.0] 3. Dynamic (3) 阅读

[C# 4.0] 3. Dynamic (3)

 2010-09-30 21:04:16 来源:WEB开发网   
核心提示:dynamic 关键字还可用于泛型参数,classMyClass<T>{publicTX{get;set;}}classProgram{staticvoidMain(string[]args){dynamico=newMyClass<dynamic>();dynamica=new{X=123};

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 的一种功能。

Tags:Dynamic

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接