注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

C#在 .Net 4.0之后的新特性  

2012-08-14 14:41:10|  分类: DotNet |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

.NET Framework的每一个新版本都给我们来带许多让.NET变得更强大和易用的新特性,.NET 4.0版当然也不例外。当我们关注一个个单独的新特性时,就会看到微软为兑现“联合发展”的诺言。

动态查询(Dynamic Lookup)

前面我们提到过,C#新增了一个叫做动态(dynamic)的全新静态类型。虽然我们很多情况下它都能运行,但是并不太常用。你可以把动态类型当成一种支持延迟绑定的对象。

  1. dynamic Car = GetCar();               //Get a reference to the dynamic object  
  2. Car.Model = "Mondeo";                 //Assign a value to a property (also works for fields)  
  3. Car.StartEngine();                    //Calling a method  
  4. Car.Accelerate(100);                  //Call a methods with parameters  
  5. dynamic Person = Car["Driver"];       //Getting with an indexer  
  6. Car["Passenger"] = CreatePassenger(); //Setting with an indexer  

在编译时,对动态对象的字段、属性以及方法都基本上被忽略了。也就是说,即使某个成员不可用,在编译时也不会提示编译错误。因为那些信息时只有在运行时才会可用,.NET 知道如何使用DLR来解析动态成员。C#至今为止仍然是一门静态类型语言,就是因为性能上的考虑。新提供的这种动态类型并不就意味着你可以完全抛弃静态类型,它只是你不得不使用动态类型时可以用的一个工具。

命名和可选参数(Named and Optional Parameters)

命名和可选参数已出现在VB.NET相当长的一段时间,现在C#终于也支持了。顾名思义,可选参数是你可以选择性地向方法或者构造函数传递参数。如果你的选择是不传递参数,那么被调用的这个方法就会使用之前定义的默认值。在C#中,要把一个方法的参数变成可选参数,只需要赋给它一个默认值就可以了。

  1. public void CreateBook(string title="No Title"int pageCount=0, string isbn = "0-00000-000-0")  
  2. {  
  3.     this.Title = title;  
  4.     this.PageCount = pageCount;  
  5.     this.ISBN = isbn;  
  6. }  

你可以用下面这几种形式调用上面定义的CreateBook方法

  1. CreateBook();  
  2. CreateBook("Some Book Title");  
  3. CreateBook("Some Book Title", 600);  
  4. CreateBook("Some Book Title", 600, "5-55555-555-5");  

这里要注意的是可靠参数的位置是很重要的。在这个例子中,title必须是以第一个参数出现,page count作为第二个,然后ISBN作为第三个。如果你想调用CreateBook ,但只传递ISBN号码这个参数,那么你有两种方案可以实现这点。第一种方案是创建一个以ISBN为参数的重载方法,这种方法是很经典的办法,但是也是较为繁冗的。第二种方案是使用命名参数(named parameter),这种方案比前一种要简洁得多。命名参数可以让你以任何顺序传递参数,你只要提供参数的名字就可以了。这时,你可以用以下几种形式调用方法:

  1. CreateBook(isbn: "5-55555-5555-5");  
  2. CreateBook("Book Title", isbn: "5-55555-5555-5");  
  3. CreateBook(isbn: "5-55555-5555-5", title: "Book Title", pageCount: 600);  

请注意,最开始你可以使用位置参数(positional parameter),然后再像用我们上面演示的第二种方法,但是如果你用上了命名参数(named parameter),那就必须得一直用下去。

动态导入(Dynamic Import)

几乎所有通过COM API暴露出的接口都是使用可变数据类型,以前在C#中这是用数据类型对象表示的。在此之前,C#中是没有办法处理动态类型的,所以对这些类型的处理就变成了各种各样数据类型中的相互转换。不过现在C#中开始支持动态类型,你就可以把COM组件当作动态对象导入了,这样就可以不用显式转换对象类型而直接设置属性、调用方法了。

省略引用参数(Ref Parameter)

调用COM API所带来的另一个副产物就是,大量方法的参数必须通过引用传递。在大多数情况下,我们都只是想传一个值给方法,而不关心它返回的是什么。尽管如此,你依然需要创建许多临时变量来保存结果。这种单调乏味的工作可以交给实习生来做,让他们获得所谓“实际工作经验”。在C#4.0里,你可以向COM里直接传递参数值,编译器会自动帮你生成临时变量。从而节省开发人员时间,也让实习生丧失了很多所谓“实际工作经验”。

协变(Co-variance)和逆变(Contra-variance)

泛型(generics)中最惊人的一个问题已经在.NET 4.0中得到解决。以前,如果你有一个支持 IEnumerable<String>的对象 , 随后你想把它传递给一个需要 IEnumerable<object> 型参数的方法,你会发现这根本无法做到。你得生成一个新的支持 IEnumerable<object> 的对象,用从IEnumerable实例中获得的字符串填充它,然后再把它传递给方法。我们都知道,字符串是比对象更具体的类型,因此,我们理所当然地认为 List<string> 应该支持 IEnumerable<string> 接口和 IEnumerable<object> 。结果是,编译器并不会这样做。不过,在.NET 4.0里,这个问题已经得到了解决。因为现在泛型(generics)已经支持协变和异变。

协变和逆变都是关乎到程序的类型安全和性能的。粗略地说,协变表示可以认为某个对象具有弱派生性(less derived),只要在常规类型的参数前加上out关键字就表示协变了。协变类型被限制在输出位置中使用,也就是说它们只有在调用方法或者访问属性的结果里出现。这些就是协变类型能称得上”安全“的唯一地方,或者说是唯一一个在编译时不需要进行额外的类型检查的地方。在.NET4.0中 , IEnumerable<T> 接口也就等同于 IEnumerable<out T> 因为IEnumerable是协变的。这也意味着下面的例子是完全有效的:

  1. IEnumerable< string> strings = GetStrings();  
  2. IEnumerable< object> objects = strings;  

逆变(Contra-variance)表示可以认为某个对象具有强派生性(more derived),它可以通过在普通参数类型前加上in关键字修饰表示。逆变类型是限制在输入位置使用的,也就是说它只能出现在方法的参数中或者说必须是拥有”只写“属性。在.NET中4.0 中, IComparer<T> 接口现在变成了 IComparer<in T> ,因为IComparer是异变的。这个概念理解起来不太容易,但是领会了它们的含义之后能够免去泛型转换中的许多麻烦。

无需主互操作程序集(Primary Interop Assemblies)编译(C#和VB .NET中新引入)

主互操作程序集(Primary Interop Assemblies, PIA)是厂商提供的程序集,它处于COM组件和.NET Framework之间,其中最广为人知的是微软Office 主互操作程序集。在开发过程中,如果你的程序集里有对PIA的引用,那么就必须在布署程序集时附带上PIA,或者提供如何获得PIA的说明。C#和VB .NET的新特性允许你直接把PIA嵌入到自己的程序集中,从而大大简化布署。PIA往往比较大,所以把它整个包含进去可能会使得你的程序集臃肿很多。幸运的是,编译器会优化地选择只嵌入你实际上用到的那一部分PIA,这样在你只用到了PIA的一小部分时能有效减小PIA的点位面积(footprint)。

【from http://developer.51cto.com/art/200907/134082.htm

【本文链接:http://zwkufo.blog.163.com/blog/static/258825120127142402546/ 

  评论这张
 
阅读(810)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017