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

刚才刚看完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/。在线和下载都有。

阅读更多

★★ Anders Hejlsberg谈C# (Part1)

09-20

译者:lxpbuaa(桂枝香在故国晚秋)rn原文见:http://msdn.microsoft.com/vcsharp/headlines/hejlsberg/default.aspxrnrn Anders Hejlsberg为Borland工作13年后,于1996年加盟微软,致力于Visual J++和WFC(Windows Foundation Classes)的设计。然后,担任C#主要设计师和Microsoft .NET Framework设计小组核心成员。目前,他还将继续领导C#语言的设计工作。rn 2003年7月30日,Hejlsberg在他微软的办公室会见了Bruce Eckel(Thinking in C++和Thinking in Java的作者)、Bill Venners(Artima.com主编)。会见内容主要分为三个部分:rnrn1、C#设计过程,语言易用性和美学观。rn2、在Checked Exceptions问题上保持中立。rn3、代理的概念,组件概念在C#中的至高地位rnrnrnrnC#设计过程rnrnBruce Eckel:我听说C#是一个工程师小组在一个屋子里设计出来的?rnAnders Hejlsberg:是的。4年来,我们一直呆在这个屋子里。现在,每周一、三、五,我们仍然在这里见面。rnBruce Eckel:我很想知道C#的设计过程。我目前直接或者间接的参与几种语言的设计工作,如Python。在Python开发小组中,Guido van Rossum被诙谐的称为“仁慈”的领导者。rnAnders Hejlsberg:哦,Guido van Rossum就相当于我的位置。rnBruce Eckel:那么在C#小组中,你也是一个“仁慈”的领导么?rnAnders Hejlsberg:我一般充当打破僵局的角色。有一次,我们被一个问题困扰多时,到了该了解的时候了,于是我马上作出了选择;当然大多数这样的情况下, 选择是显而易见的。rnBruce Eckel: 和Turbo Pascal 、Delphi相比,C#的设计过程是不是很相似?rnAnders Hejlsberg: 前二者的设计过程要非规范一些。因为Turbo Pascal 主要是我一个人设计的,而Delphi也是我和Chuck Jazdzewski、Gary Whizin组成一个很小的小组来完成,所以没有必要采用非常规范的设计过程。而C#的设计过程十分规范,每周一、三、五从1:00到3:00, 我们都会召开一个正式会议,来发现、讨论并解决问题,这些问题和解决方案也会被列表整理并发布到因特网上。rnBruce Eckel: 那你们怎么发现问题呢? rnAnders Hejlsberg: 呵呵,我们有一套行之有效的方法。我们可以通过很多途径来得到用户对这种语言的反馈意见——如软件设计讨论会、新闻组。这些意见包括:疑问、软件错误、不一致、不规范性等。这样我们就知道自己该做什么了。我们一再推敲这些意见提出的问题,反复问自己:“对此我们有没有新的想法?这个问题已经搁置好几个星期了,我们花30分钟集中精力研究一下,看这次是否能有所斩获”。rnBruce Eckel: 可能一个问题长期没有解决,都放臭了…… rnAnders Hejlsberg: 或许有些问题只有在下一个版本推出时才有最佳解决时机。但是我认为这样一个过程可以保证不会遗漏任何问题。有些可能在问题列表里放置很长时间,你可以自己决定是不是继续去研究它。我们可以时不时的回头去看看它们,尽管这不是必然的,但这些问题不会被丢失。rnBill Venners: C#设计小组包含哪些成员,他们都担当什么角色?rnAnders Hejlsberg: 开始有Scott Wiltamuth、Peter Golde、Peter Sollich、 Eric Gunnerson和我。到了C# 2.0时是Peter Hallam、Shon Katzenberger、Todd Proebsting和我。rn rnrn易用性和语言美学rnrnBill Venners: 在C#的设计中,易用性、市场策略、美学的侧重是如何权衡的?rnAnders Hejlsberg:一般而言,好的语言设计过程体现了对设计小组成员的品味取向的综合,也就是你刚才所说的语言美学观。美学取向带有极大的主观性,很难定论,只有产品出来后,你才能仔细体味它。我认为任何程度的易用性都无法像美学性一样给你同样的感觉,因为易用性是因人而异的、是非常具体的。可能有人问你:“你认为这部分特性如何?”这个问题很难回答。“你对这个语言有什么看法?”你从何谈起呢?你怎么可能花两个小时就解决掉易用性问题?没可能的。rnBruce Eckel: 有些人必须深入理解这个问题。rnAnders Hejlsberg: 使用一种编程语言会经历一个感觉微妙变化的过程。只有数个月之后用户才能真正喜欢上它。他们会逐渐发现:“哦,它给人的感觉很舒服。”你不能急于求成。rn开始说过,我们对于易用性也做了大量工作,但主要是针对部分特性。rnBill Venners: 可以举个例子么? rnAnders Hejlsberg: 我们将易用性的侧重点放在了IDE上。我们会问自己:“人们是否知道点击右键能作些什么?”在纯语言语法部分,我们也考虑了一些易用性问题——例如对一些属性何事件的处理——其实根本没必要。rn相对于语言易用性来说,我认为你不可能从用户那儿得到和IDE易用度同样高的忠诚度。IDE是和用户完成交互功能的,你可以看到用户通过点击右键能得到很好的信息反馈。而对语言来说,问题要多一些。例如:“它的概念容易理解么?”我们通过用户建议交流会、留言板,比较好的解决了这些问题。你希望有个地方可以发言,“对于这部分特性,我有这样一些想法,你们都想到了么?”你肯定乐意这些问题尽可能提的尖锐、有针对性一些,因为你最希望在产品出来以前能知道用户的想法,而不是产品推出以后。所以,在一个语言特性被完全敲定前,我们通常都会考虑用户的建议和意见。rn

没有更多推荐了,返回首页