您的位置:首页 > 编程语言 > C#

C#4.0新特性之(一)动态查找

2009-11-30 20:55 267 查看
C#4.0新特性之(一)动态查找

  在大神Anders的领导下,C#这门语言也越来越快地朝着编程语言宇宙第一神器进化,C#4.0的新特征都是围绕“动态”(dynamic)的概念的,本文我们先来看看第一个新特性:动态查找(Dynamic Lookup)。

1.初识dynamic

动态查找允许动态(即在运行时)实现对某个对象的操作与对象类型的绑定,而不管这个对象是来自COM,IronPython,HTML DOM还是CLR的反射。你可以在程序中绕过编译器的类型检查,而把类型的匹配(lookup)丢给运行时去作。如果你需要对这样的对象进行操作,则会用到一个全新的类型:dynamic

dynamic是一个和之前所有CTS支持的类型都很不一样的类型,因为他不是object!确切的说,它会告知编译器“请暂时别把我当成任何object!”。看上去这和过去的反射很类似,但是dynamic可以让我们在代码里就可以直接实现对这个未知类型对象的操作,下面我们通过一个例子来说明dynamic带来的便利。我的电脑上安装了一种叫X雷的下载软件,它提供了一些COM组件可供调用,在过去,我需要这样来调用这个COM对象:

dynamic use case

dynamic d = (dynamic)2;
Action<dynamic> dAct = new Action<dynamic>((dynamic n) => { Console.Write(n.GetType()+": "+n); });
dAct(d);
  但是dynamic也不是万能的:

  1).目前动态查找不支持扩展方法的调用(可能在未来的版本的C#中会提供支持)。

  2).匿名方法和Lambda表达式不能转换为dynamic,也就是说dynamic d = x=>x;是不合法的,事实上lambda表达式也不能转成object。一样的道理,因为lambda表达式会在上下文环境下要么被编译器解释成委托类型,要么被解释成表达式树,但是如果上下文缺乏类型信息,编译器会confuse掉。

4.总结

  dynamic是C#4.0的核心特征,感觉上是C#这种强类型的语言多了一些动态语言的特征,是对C#和.Net的一个完善。如本文开头所说,作为一门编程语言,C#正在猛练北冥神功[3] ,这样下去可能C#要和ms word一样成为居家旅行杀人越货必备的武器了。

5.引用

[1] http://msdn.microsoft.com/en-us/library/microsoft.csharp.runtimebinder(VS.100).aspx

[2] http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject(VS.100).aspx

[3] http://baike.baidu.com/view/146278.htm

Author:Freesc Huang @ CNBlogs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: