`
hereson2
  • 浏览: 458412 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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<string>可以被视作IEnumerator</string>

反之,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<string>.Compare(string x, string y)的地方都会传入string,自然会被IComparer</string>

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

分享到:
评论

相关推荐

    The C# Programming Language (Covering C# 4.0) 4th Edition

    《C#编程语言(覆盖C# 4.0)第4版》是C#之父Anders Hejlsberg的杰作,这本书深入探讨了C#编程语言的各个方面,特别是针对C# 4.0版本的新特性进行了详尽的阐述。在C#的发展历程中,C# 4.0引入了许多重要改进,旨在...

    Anders,C#之父,C# 语言规范(Anders 作品国内某些鸟人拿来赚钱的书)

    1. **语法与语义**:C#的语法是基于面向对象编程的原则,它采用了简洁而直观的结构,使得代码易于理解和编写。语义方面,C#强调类型安全和异常处理,确保程序在运行时的稳定性和可靠性。 2. **类型系统**:C#有严谨...

    QT024-微软C#语言参考,Anders Hjlsberg and Scoot Wiltamuth著

    《QT024-微软C#语言参考》是由Anders Hjlsberg和Scoot Wiltamuth共同编著的一本技术专著,这本书详细阐述了C#编程语言的核心概念和技术,对于深入理解C#及其应用至关重要。Anders Hjlsberg是C#的主要设计者之一,...

    C# 语言规范 1.0~5.0

    《C# 语言规范 1.0~5.0》是C#编程语言的重要文档,由Scott Wiltamuth和Anders Hejlsberg等专家撰写。这些文档详细阐述了C#语言的语法、语义及其设计理念,为开发者提供了权威的参考指南。以下是各个版本中的关键知识...

    W3SCHOOL的C#编程基础-很棒

    - **可扩展和可更新**:C#支持添加新功能而不影响现有代码。 - **丰富的类库**:C#拥有强大的标准库,包括各种预定义的类和方法。 #### 二、C#与Java、C++的比较 ##### 与C++的比较 - **内存管理**:C#使用垃圾回收...

    c#语言规范(C#精华所在。掌握它,便掌握了C#)

    8. **动态类型**:C# 4.0引入了dynamic类型,允许在运行时动态绑定对象和方法,增强了语言的灵活性。 9. **特性(Attributes)**:C#中的特性是一种元数据,可以附着在程序元素上,为编译器、运行时或工具提供额外...

    C#的将来 14-10

    Anders Hejlsberg在PDC2008上的发言。他演示了C#4.0的一些新特性。

    C#的将来 14-13

    Anders Hejlsberg在PDC2008上的发言。他演示了C#4.0的一些新特性。

    C#的将来 14-3

    Anders Hejlsberg在PDC2008上的发言。他演示了C#4.0的一些新特性。

    C#文档中文版

    1. modern设计:C#语言的设计基于现代编程语言的概念,具有强大的功能和灵活性。 2. 面向对象:C#语言是一种完全面向对象的编程语言,支持继承、多态和封装等面向对象的特性。 3. 通用性:C#语言可以用于开发各种...

    Introduction to C#

    8. **元数据**:C#支持元数据,可以为代码添加描述信息,方便反射和其他高级功能。 9. **扩展方法**:允许在不修改原有类的情况下向其添加新方法,增强了代码的灵活性。 【C#的发展历程】 自2000年发布以来,C#...

    C#入门课件PPT 作者是c#之父Anders Hejlsberg 绝对权威

    C#引入了新的基本数据类型,如Decimal和SQL相关的类型,这些类型可以直接与其他对象交互。集合和其他数据结构对于所有类型的对象都能正常工作,增强了语言的统一性和一致性。 此外,C#还强调了安全性、类型检查和...

    C#历史版本

    - **起源与初步设计**:C#的创始人安德斯·海尔斯伯格(Anders Hejlsberg)是一名资深程序员,他之前参与过Turbo Pascal和Delphi等知名项目的开发。基于他对编程语言和开发工具的理解,他开始着手设计一种新的语言,...

    C#编程语言详解

    全书从C#语言的简介开始,完整并详细地介绍了C# 1.0的技术规范,并介绍了许多C# 2.0的新功能,包括泛型、匿名方法、迭代器、分部类型和可空类型等。本书对第一版中介绍的C#新增了许多功能,并做了很多改进。, 本书...

    C#的将来 14-6

    Anders Hejlsberg在PDC2008上的发言。他演示了C#4.0的一些新特性。

    C#的将来 14-4

    Anders Hejlsberg在PDC2008上的发言。他演示了C#4.0的一些新特性。

Global site tag (gtag.js) - Google Analytics