C# 4,最大的创新点是拥有了动态编程语言的特性

http://www.itjxue.com  2015-07-17 21:29  来源:未知  点击次数: 

  近几年来,在TIOBE公司每个月发布的编程语言排行榜[1]中,C#总是能挤进前10名,而在近10年的编程语言排行榜中,C#总体上呈现上升的趋势。C#能取得这样的成绩,有很多因素在起作用,其中,它在语言特性上的锐意进取让人印象深刻(图 1)。

  图1 C#各版本的创新点

  

 

  2010年发布的C# 4,最大的创新点是拥有了动态编程语言的特性。

  1 动态编程语言的中兴

  动态编程语言并非什么新鲜事物,早在面向对象编程语言成为主流之前,人们就已经使用动态编程语言来开发了。即使在Java、C#、C++等面向对象编程语言繁荣兴旺、大行于世的年代,动态编程语言也在“悄悄”地攻城掠地,占据了相当的开发领域,比如 JavaScript业已成为Web客户端事实上的主流语言。

  最近这几年,动态编程语言变得日益流行,比如Python、Ruby都非常活跃,使用者众多。

  这里有一个问题,为什么我们需要在开发中应用动态编程语言?与C#和Java这类已经非常成熟且功能强大的静态类型编程语言相比,动态编程语言有何优势?

  简单地说,使用动态编程语言开发拥有以下的特性:

  (1)支持REPL(Read-evaluate-print Loop:“读入à执行à输出”循环迭代)的开发模式,整个过程简洁明了,直指问题的核心。

  举个简单的例子,图 2所示为使用IronPython[2]编程计算“1+2+……+100”的屏幕截图,我们可以快速地输入一段完成累加求和的代码,然后马上就可以看到结果:

  图2 使用IronPython编程

  

 

  如果使用C#开发就麻烦多了,您得先用Visual Studio创建一个项目,然后向其中添加一个类,在类中写一个方法完成求和的功能,再编写调用这一方法的代码,编译、排错,最后才能得到所需的结果……

  很明显,对于那些短小的工作任务而言,动态编程语言所具备的这种REPL开发模式具有很大的吸引力。

  (2)扩展方便。用户可以随时对代码进行调整,需要什么功能直接往动态对象上“加”就是了,不要时又可以移除它们。而且这种修改可以马上生效,并不需要像C#那样必须先修改类型的定义和声明,编译之后新方法才可用。

  换句话说:使用动态语言编程,不需要“重量级”的OOAD,整个开发过程迭代迅速而从不拖泥带水。

  (3)动态编程语言的类型解析是在运行时完成的,可以省去许多不必要的类型转换代码,因此,与静态编程语相比,动态编程语言写的代码往往更紧凑,量更少。

  动态编程语言主要的弱点有两个:

  (1)代码中的许多错误要等到运行时才能发现,而且需要特定的运行环境支持,对其进行测试不太方便,也不支持许多用于提升代码质量的各种软件工程工具,因此不太适合于开发规模较大的、包容复杂处理逻辑的应用系统。

  (2)与静态编程语言相比,动态编程语言编写的程序性能较低。不过随着计算机软硬件技术的不断进步,比如多核CPU的广泛应用,动态编程语言引擎和运行环境不断地优化,动态编程语言编写的程序性能在不断地提升,在特定的应用场景下,甚至可以逼近静态语言编写的程序。

  2 拥抱“动态编程”特性的C# 4

  为了让C#、Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个“DLR(Dynamic Language Runtime:动态语言运行时)”(图 3)。

  图3 DLR:动态语言运行时

  

 

  DLR运行于CLR之上,提供了一个动态语言的运行环境,从而允许Python、Ruby等动态语言编写的程序在.NET平台上运行,同时,现有的.NET静态类型编程语言,比如C#和Visual Basic,也可以利用DLR而拥有一些动态编程语言的特性。

  (1)使用C# 4编写动态的代码

  C# 4新增了一个dynamic关键字,可以用它来编写“动态”的代码。

  例如,以下代码创建了一个ExpandoObject对象(注意必须定义为dynamic):

  dynamic dynamicObj = new ExpandoObject();

  这一对象的奇特之处在于,我们可以随时给它增加新成员:

  dynamicObj.Value = 100; //添加字段

  dynamicObj.Increment = new Action(() => dynamicObj.Value++); //添加方法

  这些动态添加的成员与普通的类成员用法一样:

  for (int i = 0; i < 10; i++)

  dynamicObj.Increment();//调用方法

  Console.WriteLine("dynamicObj.Value={0}",dynamicObj.Value);//访问字段

  ExpandoObject对象实现了IDictionary接口,可看成是一个字典对象,所有动态添加的成员都是这个字典对象中的元素,这意味我们不仅可以添加新成员,还可以随时移除不再需要的成员:

  //移除Increment方法

  (dynamicObj as IDictionary).Remove("Increment");

  方法移除之后,再尝试访问此方法将引发RuntimeBinderException异常。

  (2)使用dynamic关键字简化与COM组件交互的代码

  要在.NET这个“托管世界”里调用“非托管世界”中的COM组件,我们必须通过 “互操作程序集(Interop Assembly)”作为桥梁,“互操作程序集”定义了CLR类型与COM类型之间的对应关系。

(责任编辑:IT教学网)

更多

推荐编程综合文章