您所在的位置:开发 > .NET > C# > C# 4.0新功能和展望(1)

C# 4.0新功能和展望(1)

2008-11-04 11:06 张羿 CSDN博客 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

刚才刚看完Anders的PDC Talk,感觉C# 4.0的变化不是很大,但是很多改动都方便了用户的使用,有些甚至当初Anders本来不愿意加入的功能最后由于用户的呼声最后还是加进去了(如Optional Parameters),可见Anders对用户的意见还是非常重视的。稍微总结一下,C# 4.0中有下面这些功能.

AD:

刚才刚看完Anders的PDC Talk,感觉C# 4.0的变化不是很大,但是很多改动都方便了用户的使用,有些甚至当初Anders本来不愿意加入的功能最后由于用户的呼声最后还是加进去了(如Optional Parameters),可见Anders对用户的意见还是非常重视的。稍微总结一下,C# 4.0中有下面这些功能:

1. dynamic/IDynamicObject

这个改进使得C#向动态语言又进了一步,虽然C#并不会变成类似Perl/Python之类的动态语言(因为Anders认为静态语言所支持的一些特性比如Intellisense,类型检查等等是相当有用的),但是这并不代表C#不应该对动态特性提供更好的支持。从我们Interop的角度来看,dynamic比较类似COM中的IDispatch,也就是动态的根据提供的函数/属性名字动态选择匹配的动作并执行之,只不过这个接口现在变成了IDynamicObject。写法也很类似VB6。

原来要写:

object obj = GetObject();  
obj.GetType().InvokeMember(“CallSomeFunc”, …., new object[] { 1 });

现在只需:

dynamic obj = GetObject(); 
 obj.CallSomeFunc(1); // obj通过IDynamicObject接口,支持CallSomeFunc方法。   

这一切都是通过IDynamicObject接口实现的。只要对象支持IDynamicObject,那么任意对象都可以通过这种方式来直接调用,不管是COM,Python,JavaScript,等等。这个功能感觉基本上就是定义一个接口,然后编译器再把代码翻译一下就好了,关键还是各种对象的支持。

2. Optional Parameter / Named Parameters

以前C#特意不支持的可选参数终于现在可以支持了。命名参数也可以支持了,使用参数加冒号:

OpenTextFile(“foo.txt”, Encoding.UTF8, bufferSize:123)

3. Improved COM Interoperability

3.1 Automatic object –> dynamic mapping

原来返回object的地方,现在object可以自动被视为dynamic。因此,以前需要cast的地方现在可以省去cast了,反正dynamic对象可以通过IDynamicObject来间接调用IDispatch接口(我觉得应该还是通过MemberInfo.Invoke来间接调用IDispatch,但是暂时没有时间验证其实现方式)来自动调用对应的函数,而不需要cast到对应的interface再调用。

原来是:(Range)excel.Cells[1, 1].Value = xxx;

现在可以写成:excel.Cells[1,1].Value = xxx; // call IDynamicObject.SetMember(“Value”, xxx);

3.2 Optional and named parameters

这个无需多说了吧。BTW,现在TlbImp的结果中(也就是Interop Assembly)已经在Metadata包含了缺省值,只是C#不用而已,现在C#可以直接使用了。

3.3 Indexed Property

这个Anders一句话带过,暂时不清楚具体是什么改进。

3.4 Optional ref modifier

在COM Interop时候可以不用写ref。具体的Anders也没有多谈。觉得应该是很小的改动。

3.5 Interop Type Embedding (NO PIA)

这个也就是之前我在前一篇提到的Type Equvalency。原来为了保证同一个COM接口具有相同的托管类型(因为对于同一个COM接口可以有多个对应的托管的接口),推荐使用PIA(Primary Interop Assembly)。但是,在使用PIA的过程中,发现PIA有不少问题,因此CLR Interop的某位牛人Architect想出了这个新Idea:不使用PIA,而是允许对应同一COM接口的不同托管接口之间可以互换使用,无需Cast,CLR内部将它们等价看待。这是一个比较大的改动,不管是对于编译器,还是CLR。更多的细节我会在以后的Blog中分若干次详细介绍。

内容导航

关于C#4.0  C#功能  C#展望的更多文章
双剑合璧 PHP+MySQL的最佳实践

PHP语言和MySQL数据库这两种开源技术已经成为开发Web应用的最佳[详细]

网友评论TOP5

查看所有评论(

提交评论

  1. 编程排行榜:图形编程的LOGO语言
  2. 什么是响应式Web设计?

热点专题

更多>>

读书

Linux标准教程
本书以Linux Redhat 9.0中文版为基础编写,从易用性和实用性角度出发主要介绍Linux Redhat 9.0中文版的应用知识,通过本书的学习

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 移动互联网生活门户 灵客风LinkPhone