`
guoyiqi
  • 浏览: 1001863 次
社区版块
存档分类
最新评论

c# 4.0新特性一览(转自:http://www.cnblogs.com/palo/archive/2009/03/01/1400949.html)

 
阅读更多

终于静下心来仔细听了一遍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这些动态语言的影子。虽然越来越偏离静态语言的道路,但从另一个角度来说,这些特性也都是为了提高程序员的生产力。至于被接受与否,还是让时间来说话吧。

image

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交互做了下面几方面的改进:

  1. Automatic object -> dynamic mapping
  2. Optional and named parameters
  3. Indexed properties
  4. Optional “ref” modifier
  5. 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#了吧:)

分享到:
评论

相关推荐

    android IM

    即时通讯相关的资料: ... 成功解决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详细设计说明书(下篇)转载(海纳百川文章http://www.cnblogs.com/David-weihw/a)

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在多个应用系统中只需登录一次,即可访问所有相互信任的应用系统,无需再次进行身份验证。本详细设计说明书的下篇将深入探讨SSO的核心原理、实现方式及...

    C# 简单的作业调度

    ,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:...

    C# 并发测试

    存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发处理。存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发...

    Web 断点续传批量上传上传工具

    开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:...

    JS截屏控件

    开发文档-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

    webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客...

    23种设计模式的java实现

    命令模式 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安装与使用-转自http://www.cnblogs.com/wllyy189/archive/2008/11/15/1334002.html

    HSQLDB因其简单易用、快速启动和关闭、体积小、内存数据库特性而被广泛应用于测试环境和小型项目中。 **安装HSQLDB** 1. **下载**: 首先,你需要从官方网站或者第三方源(如Apache镜像站点)下载HSQLDB的最新版本...

    一个牛人提供的GIS源码(很好)

    [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都市做个...

    谷歌开源的Google Preview Image Extractor.zip

    这个项目可以考虑用在特定情况下加速加载无损格式的预览图,提升用户体验 该项目没有demo代码,demo代码可参考博客园的一位网友的文章:http://www.cnblogs.com/tntmonks/p/5143350.html 标签:无损图片

    .net C# 学习过程中收藏的一些比较有用的和感兴趣的链接

    http://www.360doc.com/userhome.aspx?userid=19107491&cid=3 jQuery基本选择器及用法 前端模块化开发(AMD和CDM规范) ...http://www.cnblogs.com/dwlsxj/p/4052871.html 浅析MSIL中间语言——PE文件结构篇

    MVC5&EF6入门教程_Part3

    转自:http://www.cnblogs.com/miro/p/4030622.html 整理到了doc文档里,内含代码。 方便一起学习。

    开源GIS最著名的地图投影库Proj.4库

    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

    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

    EyesBaby1.0 源代码

    EyesBaby功能实现之窗口拖拽与缩放功能(http://www.cnblogs.com/yizhuqing/archive/2010/01/07/1640856.html) EyesBaby功能实现之图片控件上添加字符...

    “二维码”QRCode -新版火车票(wm+c#+源码)

    12月10日起,全国铁路系统火车票将实现从5.0版本到5.2版本的升级。新旧版本车票最大的区别,就是车票下方的一维防伪条码将变成二维防伪图案,防伪...http://www.cnblogs.com/longqi293/archive/2009/09/23/1572427.html

    django项目实例(django 简易博客开发)

    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 ...

    Android代码-SmartPopupWindow

    SmartPopupWindow ...Android7.0 PopupWindow的兼容问题,修复了问题1和3中描述的问题,但是由引入了新的问题吗,具体详情 博文地址:http://www.cnblogs.com/popfisher/p/6434757.html Github地址:...

    android的回调机制(转自http://www.cnblogs.com/vtianyun/archive/2012/06/19/2555427.html)

    - `onStop()`:当Activity不再对用户可见时调用,通常意味着新Activity启动或当前Activity被完全覆盖。 - `onDestroy()`:Activity将被销毁时调用,这是清理资源和释放内存的好时机。 2. **Fragment生命周期回调*...

Global site tag (gtag.js) - Google Analytics