zoukankan      html  css  js  c++  java
  • [转]PDC:Anders谈C# 4.0:新功能和展望

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

    刚才刚看完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#也可以做了! 

    1. 相关阅读:
      leetcode 155. Min Stack 、232. Implement Queue using Stacks 、225. Implement Stack using Queues
      leetcode 557. Reverse Words in a String III 、151. Reverse Words in a String
      leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
      leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
      leetcode 162. Find Peak Element
      leetcode 88. Merge Sorted Array
      leetcode 74. Search a 2D Matrix 、240. Search a 2D Matrix II
      Android的API版本和名称对应关系
      spring 定时任务执行两次解决办法
      解析字符串为泛型的方法
    2. 原文地址:https://www.cnblogs.com/day/p/1731475.html
    Copyright © 2011-2022 走看看