VS2010开发体验系列之二 - 语言C#4.0
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相关推荐
- Cocos Creator | 飞刀大乱斗开发教程系列(二)!
点击上方蓝字关注我 预览效果 具体内容 ■ 这一期,主要讲解主页中间人物效果的实现.也就是,在下方列表选择不同人物,上方显示不同的人物,播放不同的效果,即下图的效果实现,此部分也是采用预制 Prefa ...
- AI应用开发实战系列之二:从零开始搭建macOS开发环境
AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 零.前提条件 一台能联网的电脑, ...
- 『飞秋』测试驱动开发TDD系列(二)
引言 今天我们来做一个TDD的小例子.通过一个栈的实现来体验一下TDD的过程.在本系列的代码示例中,使用VS2010作为IDE工具,NUnit作为测试辅助工具.关于NUnit的使用,在园子中已经有很多 ...
- 敏捷开发生态系统系列之二:敏捷生态系统-计划跟踪 I(跨职能团队-共同估算-每日立会-同行压力)...
这是敏捷生态系统系列的第二篇(之一,之二,之三,之四,之五). 如果说需求管理中尚有一些团队无法控制的因素导致实施困难,计划与跟踪过程总归就没有问题了吧?其实不然,笔者见过领导很放权的全团(很多是因为 ...
- iOS开发学习系列(1)———Swift语言入门
缘起 对于成为全栈开发者的目标而言,很好奇自己几年前怎么就没想过iOS开发的事情.iOS好歹也是移动操作系统两巨头之一.反思了下,有可能是因为之前对Object-C太无感导致的.现在趁着Swift,借 ...
- phoenix 开发API系列(二)phoenix 各类 api 实现方式
概述 上一篇已经提到如何安装以及利用 phoenix framework 来开发一个简单的 api. 接着上次的工程,下面演示如何通过 phoenix framework 来构建各种类型的 api 来 ...
- ArcGis api配合vue开发入门系列(二)距离以及面积的测量
正文 首先自定义个工具栏,包括测量距离与测量面积的工具以及地图漫游. 图标的话是用的iconfont.我是把这个工具单独写在一个组件里面,这个组件里面里面会用到一些操作地图的方法,我在map这个组件里 ...
- LinuxC++开发面试系列(二):权限修改、进程管理与vim
文章目录 同步GitHub在此
- 提升HTML5的性能体验系列之一 避免切页白屏
提升HTML5的性能体验系列之一 避免切页白屏 白屏 切换页面 性能 转场 提升HTML5的性能体验系列文章目录导航: - [提升HTML5的性能体验系列之一 避免切页白屏] - 提升HTML5的性能 ...
最新文章
- 毕业设计:基于Springboot实现求职招聘,校园招聘系统
- php接口图片转二进制,怎么在php项目中对图片进行二进制转换
- 【Java代码】使用 org.apache.ibatis.plugin.Interceptor 拦截器实现全局 mapper.xml 参数注入(可用于切换数据库实例schema+Demo举例源码)
- go 公众号 关注 监听_开言英语公众号关注
- 在div中设置文字与内部div垂直居中
- 丹琦女神新作:对比学习,简单到只需要Dropout两下
- 有向图的邻接表描述 c++
- cocos2dx中关于Action动作的相关API的具体介绍
- 黑科技!颠覆者!区块链,再不关注就晚了
- c语言编写的程序不具备移植性,《C语言》试卷1
- getch()函数的使用方法及其返回值问题
- k8s--基础--12.2--pod--生命周期,状态,重启策略
- 视频语音转换成文字要怎么操作呢?
- 匿名上位机v2.6和V7自定义帧代码和飞控姿态代码
- 如何把一个文件夹的文件分配到多个文件夹
- PrintWriter out=response.getWriter()的问题
- java5至java17新特性总结(开发相关)
- 图标设计五条黄金法则
- 首次接触大数据及其见解
- 记录一个C++多线程的坑