C#从1.0到4.0, 每次都会引入比较大的变化, 比如2.0的泛型,3.0的var,这次4.0也引入了一些新的东西,如下:

  • DLR(动态语言运行时)
  • 命名参数和可选参数
  • 特定于COM的互操作
  • 协变和逆变

笔者首次尝试了这4个新特性,下面一一做简单的介绍:

1. DLR(动态语言运行时)

在CLR之上,.NET引入了一个叫DLR(Dynamic Language Runtime)的组件,这套组件提供了一系列的服务,用以支持动态语言。细分下来,主要是两方面:在静态语言类型中引入动态类型和支持动态语言比如IronRuby&IronPython. 以下这个架构图可以帮助您理解DLR。

刚才讲到, DLR提供了两个方面的支持,下面分别演示一下代码:

第一个方面,静态语言类型的动态支持,让我们看看一组代码,假设有三个类,Customer, VIP, Parterner.

可以看到,对于dynamic关键字声明的对象,是不会在编译时检查类型的成员比如属性的,在runtime时DLR会动态检查对象的成员,并执行之。

有人认为,这样做的好处是,可以在修改了类名的情况下,保持调用者代码不变。我个人认为这个功能意义不大,如果非要保持调用者不变,做好interface就行了,何必这么辛苦呢。更何况,这种静态类型跟动态类型之间的转换,performance还是比较差的,尽管DLR提供了方法调用的cache功能,性能上能有多大提升,还需验证。

第二个方面,是对动态语言的支持。

一个是对IronPython和IronRuby的支持,一个是C#/VB等静态类型语言与动态类型语言的交互。前者超出了C#4.0的范畴,我们重点看看后者。

如以上代码所示,这个动态类型的核心是TryGetMember和TrySetMember这两个方法(当然,必须继承DynamicObject类,或者DynamiceMetaObject类,或者实现IDynamicMetaObjectProvider接口). 当编译器发现代码试图get/set一个没有预先定义的Property时,就会让DLR去TryGetMember/TrySetMember方法中寻找对应的Property。这个实现也是与动态语言比如IronPython/IronRuby交互的基础。

2. 命名参数和可选参数

这个比较简单,相信下面的代码可以很快让人明白这个特性。

可选参数示例(顾名思义,就是定义过默认值的参数,是可选的,调用方可以决定是否传值进来)

命名参数示例(对于上面最后一种情况,可以在调用方显示制定传入值属于哪个参数)

3. 特定于COM的互操作

还记得这样的代码么, 当我们想访问一个Excel文件,  我们需要写一堆无用的ref missing, 如下:

现在, 简化成下面这样了,

对此, 没什么好说的, 只能说原来太失败了.

据介绍, 在C#4.0中, 对COM的互操作主要做了一下改进,

Automatic object -> dynamic mapping

Optional and named parameters

Indexed properties

Optional “ref” modifier

Interop type embedding (“No PIA”)

有空可以仔细研究每个改进的细节.

4. 协变和逆变

这个feature更像是修bug。

我觉得需要先解释一下什么是协变, 什么是逆变.

所谓协变, 是指把类型从子类变到基类; 逆变, 则是把类型从基类变到子类. 在C#3.0中, 也有协变和逆变, 是针对delegate做的, 看如下代码:

在C#4.0中, 增加了对泛型的支持, 包括delegate的泛型参数和泛型的interface. 还是拿delegate举例,

协变, 如下代码在C#4.0以前,是不合法的:

在C#4.0里面, 因为有了对泛型委托协变的支持, 可以稍作修改如下:

逆变, 如下代码在C#4.0以前, 是不合法的:

在C#4.0里面, 因为有了对泛型委托逆变的支持, 可以稍作修改如下:

同理, 对于泛型interface, 也是如此.

关于协变和逆变, 借鉴了这篇帖子http://www.cnblogs.com/fox23/archive/2010/03/09/1615698.html, 可以去这篇帖子里看更详细的说明.

以上是C#4.0在语言层面的新特性, 当然, 还有很多细节, 光协变和逆变就可以写出一本书, 留待以后研究.

VS2010开发体验系列之二 - 语言C#4.0相关推荐

  1. Cocos Creator | 飞刀大乱斗开发教程系列(二)!

    点击上方蓝字关注我 预览效果 具体内容 ■ 这一期,主要讲解主页中间人物效果的实现.也就是,在下方列表选择不同人物,上方显示不同的人物,播放不同的效果,即下图的效果实现,此部分也是采用预制 Prefa ...

  2. AI应用开发实战系列之二:从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 零.前提条件 一台能联网的电脑, ...

  3. 『飞秋』测试驱动开发TDD系列(二)

    引言 今天我们来做一个TDD的小例子.通过一个栈的实现来体验一下TDD的过程.在本系列的代码示例中,使用VS2010作为IDE工具,NUnit作为测试辅助工具.关于NUnit的使用,在园子中已经有很多 ...

  4. 敏捷开发生态系统系列之二:敏捷生态系统-计划跟踪 I(跨职能团队-共同估算-每日立会-同行压力)...

    这是敏捷生态系统系列的第二篇(之一,之二,之三,之四,之五). 如果说需求管理中尚有一些团队无法控制的因素导致实施困难,计划与跟踪过程总归就没有问题了吧?其实不然,笔者见过领导很放权的全团(很多是因为 ...

  5. iOS开发学习系列(1)———Swift语言入门

    缘起 对于成为全栈开发者的目标而言,很好奇自己几年前怎么就没想过iOS开发的事情.iOS好歹也是移动操作系统两巨头之一.反思了下,有可能是因为之前对Object-C太无感导致的.现在趁着Swift,借 ...

  6. phoenix 开发API系列(二)phoenix 各类 api 实现方式

    概述 上一篇已经提到如何安装以及利用 phoenix framework 来开发一个简单的 api. 接着上次的工程,下面演示如何通过 phoenix framework 来构建各种类型的 api 来 ...

  7. ArcGis api配合vue开发入门系列(二)距离以及面积的测量

    正文 首先自定义个工具栏,包括测量距离与测量面积的工具以及地图漫游. 图标的话是用的iconfont.我是把这个工具单独写在一个组件里面,这个组件里面里面会用到一些操作地图的方法,我在map这个组件里 ...

  8. LinuxC++开发面试系列(二):权限修改、进程管理与vim

    文章目录 同步GitHub在此

  9. 提升HTML5的性能体验系列之一 避免切页白屏

    提升HTML5的性能体验系列之一 避免切页白屏 白屏 切换页面 性能 转场 提升HTML5的性能体验系列文章目录导航: - [提升HTML5的性能体验系列之一 避免切页白屏] - 提升HTML5的性能 ...

最新文章

  1. 毕业设计:基于Springboot实现求职招聘,校园招聘系统
  2. php接口图片转二进制,怎么在php项目中对图片进行二进制转换
  3. 【Java代码】使用 org.apache.ibatis.plugin.Interceptor 拦截器实现全局 mapper.xml 参数注入(可用于切换数据库实例schema+Demo举例源码)
  4. go 公众号 关注 监听_开言英语公众号关注
  5. 在div中设置文字与内部div垂直居中
  6. 丹琦女神新作:对比学习,简单到只需要Dropout两下
  7. 有向图的邻接表描述 c++
  8. cocos2dx中关于Action动作的相关API的具体介绍
  9. 黑科技!颠覆者!区块链,再不关注就晚了
  10. c语言编写的程序不具备移植性,《C语言》试卷1
  11. getch()函数的使用方法及其返回值问题
  12. k8s--基础--12.2--pod--生命周期,状态,重启策略
  13. 视频语音转换成文字要怎么操作呢?
  14. 匿名上位机v2.6和V7自定义帧代码和飞控姿态代码
  15. 如何把一个文件夹的文件分配到多个文件夹
  16. PrintWriter out=response.getWriter()的问题
  17. java5至java17新特性总结(开发相关)
  18. 图标设计五条黄金法则
  19. 首次接触大数据及其见解
  20. 记录一个C++多线程的坑

热门文章

  1. Firefox人气火红 能否取代龙头IE?
  2. zjs-my-diary-0220118
  3. Logistic Regression逻辑回归函数Python实现
  4. Mybatis之xml方式(一)
  5. Java 线程的状态
  6. 完美打造跨境电商出口的七个步骤
  7. IPv6-计算机网络
  8. KL Divergence KL散度
  9. 力扣 1818. 绝对差值和 数学 二分
  10. html打印图片不显示不全,Word里图片显示全打印不全是怎么回事