Anders谈C# 4.0:新功能和展望

摘要:
刚才,在阅读了Anders的PDCTalk之后,我觉得C#4.0并没有太大变化,但许多变化让用户更容易使用。由于用户的声音,安德斯最初不想添加的一些功能最终被添加,这表明安德斯仍然非常重视用户的意见。BTW.现在,TlbImp结果在元数据中包含了默认值,但没有使用C#。现在C#可以直接使用了。安德斯没有多谈这件事。

刚才刚看完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。

原来要写:

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

现在只需:

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

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

2. Optional Parameter / Named Parameters

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

1: 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中分若干次详细介 绍。(Update:我的第一篇介绍这个新功能的文章:.NET 4.0: Type Equivalency (1) – Byebye,PIA

4. Co-Variance & Contra-Variance

这个相对难以理解一些。Co-Variance和Contra-Variance在这系列文章中有讲述:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx,此人是C#编译器的Dev,自然有比较权威的解释,而且这个系列有N篇文章,讲的比较复杂。有空我会把这块内容详细在Blog中解释一下。

简单来讲,Co-Variant表示某模板参数用作传出,也即是函数的返回值或者out参数,等等,用关键字out表明:

1: public interface IEnumerator<out T> // Co-Variant
2: {
3:     T Current { get; }
4:     bool Next();
5: }
6: 
7: IEnumerator<string> strings = GetStrings();
8: IEnumerator<object> objects = strings; // 这个OK,反之报错

在上面的转换,意味着IEnumerator可以被视作IEnumerator

反之,Contra-Variant表示模板参数T只能被用在函数入参或者属性的入参,用in表示:

1: public interface IComparer<in T> // Contra-Variant
2: {
3:     int Compare(T x, T y);
4: }
5: 
6: IComparer<object> objComp = GetComparer();
7: IComparer<string> strComp = objComp; // 这个OK,反之报错

类似的,任何使用IComparer.Compare(string x, string y)的地方都会传入string,自然会被IComparer

5. C# 5.0???

5.1 Meta-Programming Capabilities

学习Ruby On Rails,引入强大的Meta-Programming能力。

5.2 Compiler As Service

用托管代码重写编译器(原来是用C++编写的,使用IMetaDataEmit接口输出PE文件),支持其他人编写代码参与整个编译过程(估计类似Plugin)或者调用编译过程(类似已有的动态语言的eval功能)。

Anders演示了通过CSharpEvaluator直接编译用string表示的C#代码然后直接执行:

1: CSharpEvaluator ev = new CSharpEvaluator();
2: ev.Eval(“for (int i = 0; i < 10; i++) { … }");

通过这个就可以很容易写一个C#的Shell了:

C#> int Add(int a, int b) { return a+b; }

C#> Add(1, 2)

3

C#> Form = new Form() { Text = “Hello World” };

这个基本上是原来的动态语言的强项,现在C#也可以做了!

有兴趣的朋友可以在下面找到这个Talk:http://channel9.msdn.com/pdc2008/TL16/。在线和下载都有。

转自:http://blog.csdn.net/ATField/archive/2008/11/01/3203602.aspx

免责声明:文章转载自《Anders谈C# 4.0:新功能和展望》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)用HBuilderX 打包 vue 项目 为 App 的步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

20多个常用的免费WebService接口

20多个常用的免费WebService接口 天气预报Web服务,数据来源于中国气象局 Endpoint  Disco  WSDL  IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) Endpoint  Disco  WSDL  随机英文、数字和中文简体字 WEB 服务 Endpoint  Disco  WSDL  中国邮政编码 <-&g...

初次体验Ubuntu之二

1.需要知道几个快捷键: 锁屏快捷键:Win+L 终端模拟器:Ctrl+Alt+T 打开应用列表:Win+A 显示所有已打开的窗口:Win+W 打开命令运行窗口:Alt+F2 进入tty字符界面:Ctrl+Alt+F1到F6,Ctrl+Alt+F7:切换回图形桌面 2.查询显卡型号 lspci | grep -i vga lspci | grep -...

在C#和SQL Server数据库中怎么给DateTime类型赋null值、null和""的区别

今天在将数据库里的datetime类型数据赋给C#里DateTime类型变量的时候遇到一个问题,那就是数据库里面的datetime数据存在null值。 C#默认不能将null赋给DateTime变量,但是可以使用Nullable类型的DateTime,只需在声明变量的时候在DateTime后加一个?号,如: DateTime? x ; x便可以赋null值...

service和serviceImpl的选择

同行中,有些同行公司的代码风格是service层=service接口+serviceImpl实现类; 而有的同行公司的代码风格是service层=service类; 为什么不一样呢? 以前没想过这个问题,今天突然对这个产生了疑惑,通过百度,和github及朋友处以及自己的思考,有了如下结论: 当项目的业务逻辑简单时,可选择service层=service类...

wpa_supplicant

一 函数接口介绍 wpa_ctrl_open接口用来打开wpa_supplicant的控制接口,在UNIX系统里使用UNIX domain sockets,而在Windows里则是使用UDP sockets,当然接口的路径并不是固定的,可以根据配置文件内的路径设置来改变。wpa_ctrl_close接口自然是用于关闭控制接口。wpa_ctrl_reques...

usb设备 配置 接口 端点

在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口。每个配...