C#编程(六十九)

时间:2022-03-28 03:39:07

一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象深刻.

C#编程(六十九)

4动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务,它允许添加动态语言,如Ruby和Python,并使C#具备和这些动态语言相同的某些功能.

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

最近这几年,动态语言变得很火,比如Python,Ruby.

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

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

1.支持REPL(read-evaluate-print Loop:读入->执行->输出,循环迭代)的开发模式,这个过程就简洁明了了,直指问题的核心.

案例:我们使用IronPython[2]变成计算1+2+...+100,我们可以快速的输入一段完成累加求和的代码,然后马上就可以求和:

C#编程(六十九)

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

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

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

 

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

当然了,动态语言的缺点也是有的:

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

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

二.拥抱”动态编程”特征的C#4

为了让C#,VB等.NET编程语言能具备动态编程语言的特性,.NET4引入了一个DLR:

C#编程(六十九)

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

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

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

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

//这里需要添加命名空间System.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<string,object>接口,可看成是一个字典对象,所有动态添加的成员都是这个字典对象中的元素,这意味着我们不仅仅可以添加新成员,还可以随时移除我们不需要的成员.

//移除Increment方法

(dynamicObj as IDictionary<string, object>).Remove("Increment");

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

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