终于静下心来仔细听了一遍Anders Hejlsberg(Visual Studio组的TECHNICAL FELLOW,C#的设计者之一)在PDC08上讲的“The Future of C#”(http://channel9.msdn.com/pdc2008/TL16/)。
回顾C#发展的历史,C#1.0完全是模仿Java,并保留了C/C++的一些特性如struct,新学者很容易上手;C#2.0加入了泛型,也与Java1.5的泛型如出一辙;C#3.0加入了一堆语法糖,并在没有修改CLR的情况下引入了Linq,简直是神来之笔,虽然很多项目出于各种各样如性能之类的原因没有采用,但非常适合小型程序的快速开发,减轻了程序员的工作量,也提高了代码的可读性;C#4.0增加了动态语言的特性,从里面可以看到很多javascript、python这些动态语言的影子。虽然越来越偏离静态语言的道路,但从另一个角度来说,这些特性也都是为了提高程序员的生产力。至于被接受与否,还是让时间来说话吧。
PS:这里面还有一点版本号的小插曲——VS2008所对应的.Net Framework是3.5,C#是3.0,CLR是2.0,及其混乱,MS终于下决心在VS2010中把这三个版本号都统一成了4.0,于是CLR3不知所终……
Dynamically Typed Object
C#4.0加入了dynamic关键字,可以申明一个变量的static类型为dynamic(有点绕口)。
在3.0及之前,如果你不知道一个变量的类型,而要去调用它的一个方法,一般会用到反射:
有了dynamic,就可以把上面代码简化为:
使用dynamic的好处在于,可以不去关心对象是来源于COM, IronPython, HTML DOM或者反射,只要知道有什么方法可以调用就可以了,剩下的工作可以留给runtime。下面是调用IronPython类的例子:
dynamic也可以用在变量的传递中,runtime会自动选择一个最匹配的overload方法。
这里有一个demo:把一段javascript代码拷到C#文件中,将var改成dynamic,function改成void,再改一下构造函数的调用方式(new type()改为win.New.type()),去掉javascript中的win.前缀(因为这已经是C#的方法了),就可以直接运行了。
dynamic的实现是基于IDynamicObject接口和DynamicObject抽象类。而动态方法、属性的调用都被转为了GetMember、Invoke等方法的调用。
Named and optional parameters
这似乎不是什么很难实现或很新颖的特性,只要编译器的支持就可以(VB很早就支持了)。估计加入的原因是群众的呼声太高了。
带有可选参数方法的声明:
命名参数必须在最后使用:
顺序不限:
Improved COM Interoperability
在C#中在调用COM对象如office对象时,经常需要写一堆不必要的参数:
4.0中就可以直接写成:
C#4.0对COM交互做了下面几方面的改进:
- Automatic object -> dynamic mapping
- Optional and named parameters
- Indexed properties
- Optional “ref” modifier
- Interop type embedding (“No PIA”)
对第1点和第5点的简单解释如下:
在COM调用中,很多输入输出类型都是object,这样就必须知道返回对象的确切类型,强制转换后才可以调用相应的方法。在4.0中有了dynamic的支持,就可以在导入这些COM接口时将变量定义为dynamic而不是object,省掉了强制类型转换。
PIA(Primary Interop Assemblies)是根据COM API生成的.Net Assembly,一般体积比较大。在4.0中运行时不需要PIA的存在,编译器会判断你的程序具体使用了哪一部分COM API,只把这部分用PIA包装,直接加入到你自己程序的Assembly里面。
Co- and Contra-Variance
实在是不知道怎么翻译这两个词。
(感谢Ariex,徐少侠,AlexChen的提示,应翻译为协变和逆变,http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx)
在C#中,下面的类型转换是非法的:
因为你有可能会这样做,而编译器的静态检查无法查出错误:
4.0中在声明generic的Interface及Delegate时可以加in及out关键字,如:
out关键字的意思是说IEnumerable<T>中T只会被用在输出中,值不会被改变。这样将IEnumerable<string>转为IEnumerable<object>类型就是安全的。
in的意思正好相反,是说IComparer<T>中的T只会被用在输入中,这样就可以将IComparer<object>安全的转为IComparer<string>类型。
前者被称为Co-Variance, 后者就是Contra-Variance。
.Net4.0中使用out/in声明的Interface:
Delegate:
Compiler as a Service
4.0中增加了与编译器相关的API,这样就可以将字符串作为代码动态编译执行,跟javascript好像。
Video的最后,Anders做了一个很酷的demo,大概只用了二三十行代码,就实现了在控制台中直接执行C#语句,定义并调用函数,动态创建windows form,添加button等功能,看起来完全不逊色于Python,Ruby之类语言的控制台。
沉寂了n年之后,CLR终于要出新版本了,这回Jeffrey Richter大侠没有借口不出新版的CLR via C#了吧:)
分享到:
相关推荐
即时通讯相关的资料: ... 成功解决asmack不能收发文件的问题 ...http://www.cnblogs.com/not-code/archive/2011/08/01/2124340.html MTQQ http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997938.html ...
SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在多个应用系统中只需登录一次,即可访问所有相互信任的应用系统,无需再次进行身份验证。本详细设计说明书的下篇将深入探讨SSO的核心原理、实现方式及...
,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:...
存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发处理。存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发...
开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:...
开发文档-ASP.NET(C#):http://www.cnblogs.com/xproer/archive/2010/12/04/1896552.html 开发文档-PHP:http://www.cnblogs.com/xproer/archive/2011/05/16/2047915.html 开发文档-JSP:...
webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客...
命令模式 http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html 解释器模式 http://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html 迭代模式 ...
HSQLDB因其简单易用、快速启动和关闭、体积小、内存数据库特性而被广泛应用于测试环境和小型项目中。 **安装HSQLDB** 1. **下载**: 首先,你需要从官方网站或者第三方源(如Apache镜像站点)下载HSQLDB的最新版本...
[ZT]谈谈 wiki 的缺点 http://www.cnblogs.com/Tangf/archive/2006/03/01/340725.html [转贴]Web地图服务:GIS走近你我 http://www.cnblogs.com/Tangf/archive/2006/02/23/336493.html 算我给Google本地和E都市做个...
这个项目可以考虑用在特定情况下加速加载无损格式的预览图,提升用户体验 该项目没有demo代码,demo代码可参考博客园的一位网友的文章:http://www.cnblogs.com/tntmonks/p/5143350.html 标签:无损图片
http://www.360doc.com/userhome.aspx?userid=19107491&cid=3 jQuery基本选择器及用法 前端模块化开发(AMD和CDM规范) ...http://www.cnblogs.com/dwlsxj/p/4052871.html 浅析MSIL中间语言——PE文件结构篇
转自:http://www.cnblogs.com/miro/p/4030622.html 整理到了doc文档里,内含代码。 方便一起学习。
Proj.4的功能主要有经纬度坐标与地理坐标的转换,坐标系的转换,包括基准变换等。 下载也可直接使用git进行下载:git clone ...cmake下载与安装:https://www.cnblogs.com/chenyaling/p/10894084.html
libmcrypt-2.5.8.tar.gz、mcrypt-2.6.8.tar.gz、mhash-0.9.9.9.tar.gz php安装mcrpyt插件所需的包 安装方法:http://www.cnblogs.com/huangzhen/archive/2012/09/12/2681861.html
EyesBaby功能实现之窗口拖拽与缩放功能(http://www.cnblogs.com/yizhuqing/archive/2010/01/07/1640856.html) EyesBaby功能实现之图片控件上添加字符...
12月10日起,全国铁路系统火车票将实现从5.0版本到5.2版本的升级。新旧版本车票最大的区别,就是车票下方的一维防伪条码将变成二维防伪图案,防伪...http://www.cnblogs.com/longqi293/archive/2009/09/23/1572427.html
http://www.cnblogs.com/cacique/archive/2012/10/01/2709668.html django 简易博客开发 4 comments库使用及ajax支持 http://www.cnblogs.com/cacique/archive/2012/10/03/2710803.html django 简易博客开发 5 ...
SmartPopupWindow ...Android7.0 PopupWindow的兼容问题,修复了问题1和3中描述的问题,但是由引入了新的问题吗,具体详情 博文地址:http://www.cnblogs.com/popfisher/p/6434757.html Github地址:...
- `onStop()`:当Activity不再对用户可见时调用,通常意味着新Activity启动或当前Activity被完全覆盖。 - `onDestroy()`:Activity将被销毁时调用,这是清理资源和释放内存的好时机。 2. **Fragment生命周期回调*...