资源描述:
《anders谈c#4.0:新功能和展望》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、,C#4.0中有下而这些功能:1.clynamic/1DynamicObject这个改进使得C#向动态语言又进了一步,虽然C#并不会变成类似Pcrl/Python之类的动态语言(因为Anders认为静态语言所支持的一些特性比如Intclliscnsc,类型检奔等等是相当有用的),但是这并不代表C#不应该对动态特性提供更好的支持。从我们Interop的角度来看,dynamic比较类似COM中的IDispatch,也就是动态的根据提供的函数/属性名字动态选择匹配的动作并执行之,只不过这个接口现在变成了ID
2、ynamicObject。写法也很类似VB6。原来要写:1:objectobj=GetObject();2:obj.GetType().InvokeMember(“CallSomeFunc”,•".,newobject[]{1});现在只需:1:dynamicobj=GetObject();2:obj.CallSomeFunc(1);//obj通过IDynamicObject接口,支持CallSomeFunc方法。这一切都是通过IDynamicObject接口实现的。只耍对象支持IDynamicObj
3、ect,那么任意对象都可以通过这种方式来直接调用,不管是COM,Python,JavaScript,等等。这个功能感觉基本上就是定义一个接口,然后编译器再把代码翻译一下就好了,关键还是各种对象的支持。2.OptionalParameter/NamedParameters以前C財寺意不支持的可选参数终于现在可以支持了。命名参数也可以支持了,使用参数加冒号:1:OpenTextFile(“foo.txt’’,Encoding.UTF8,bufferSize:123)3.ImprovedCOMInterop
4、erability3.1Automaticobject->dynamicmapping原来返[nJobject的地方,现在object可以自动被视为dynamic。因此,以前需要cast的地方现在可以省去cast了,反正dynamic对象KT以通过IDynamicObject来间接调用IDispatch接口(我觉得应该还是通过Memberlnfo.Invoke来间接调用IDispatch,{口暂时没有时间验证其实现方式)来自动调用对应的函数,而不需要cast到对应的interface再调用。原来是:(
5、Range)excel.Cells[1,1].Value=xxx;现在可以写成:excel.Cells[l,1].Value=xxx;//callIDynamicObject.SetMember(“Value”,xxx);3.2Optionalandnamedparameters这个无需多说了吧。BTW,现在Hblmp的结果中(也就是InteropAssembly)已经任Metadata含了缺省值,只是C#不用而CA,现在C#可以直接使用了。3.3IndexedProperty这个Anders—句话带
6、过,暂时不清楚A体是什么改进。3.4Optionalrefmodifier在•COMInterop时候可以不用写ref0貝-体的Anders也没有多谈。觉得应该是很小的改动。3.5InteropTypeEmbedding(NOPIA)这个也就是之前我在前一篇提到的TypeEquvalency。原来为了保证同一个COM接口具有相同的托管类型(因为对于同一个COM接口可以有多个对应的托管的接口),推荐使用PIA(PrimaryInteropAssembly)。但是,在使用PIA的过程中,发现PIA有不少问
7、题,因此CLRInterop的某位牛人Architect想出了这个新Idea:不使用PIA,而是允许对应同一COM接口的不同托管接口之间可以互换使用,无需Cast,CLR内部将它们等价看待。这是一个比较大的改动,不管是对于编译器,还是CLR。更多的细节我会在以后的Blog中分若干次评细介绍。(Update:我的第一篇介绍这个新功能的文章:.NET4.0:TypeEquivalency(1)-Byebye,PIA)4.Co-Variance&Contra-Variance这个相对难以理解一些。Co-Va
8、riance和Contra-Variance在这系列文章中有讲述:http://blogs,msdn.com/criclippcrt/archivc/tags/Covariancc+and+Contravariance/default.aspx,此人是C#编译器的Dev,肉然有比较权威的解释,而且这个系列有N篇文章,讲的比较复杂。有空我会把这块内容详细在Blog中解释一下。简单来讲,Co-Variant表示某模板参数用作传出,也即是124:函数的返回值或