时间:2016-12-9来源:本站原创作者:佚名

本文的内容包括引入C#6.0中的新的语言特性有哪些.还有已经被引入的代码名称为“Roslyn”新编译器.编译器是开放源码的,并且可以从codeplex网站的这个地址下载到源代码:   我们可以对这些新特性一个一个的进行讨论,而首先要列出C#6.0中这些特性的一个清单

自动的属性初始化器AutoPropertyInitializer

主构造器PrimaryConsturctor

字典初始化器DictionaryInitializer

声明表达式DeclarationExpression

静态的UsingStaticUsing

catch块中的await

异常过滤器ExceptionFilter

用于检查NULL值的条件访问操作符

  1.自动的属性初始化器AutoPropertyinitialzier   之前的方式

  初始化一个自动属性AutoProperty的唯一方式,就是去实现一个明确的构造器,在里面对属性值进行设置.

3publicclassAutoPropertyBeforeCsharp6{privatestring_postTitle=string.Empty;publicAutoPropertyBeforeCsharp6(){//assigninitialvaluesPostID=1;PostName=Post1;}publiclongPostID{get;set;}publicstringPostName{get;set;}publicstringPostTitle{get{return_postTitle;}protectedset{_postTitle=value;}}}   有了这个特性之后的方式

  使用C#6自动实现的带有初始值的属性可以不用编写构造器就能被初始化.我们可以用下面的代码简化上面的示例:

publicclassAutoPropertyInCsharp6{publiclongPostID{get;}=1;publicstringPostName{get;}=Post1;publicstringPostTitle{get;protectedset;}=string.Empty;} 2.主构造器

  我们使用构造器主要是来初始化里面的值.(接受参数值并将这些参数值赋值给实体属性).

  之前的方式publicclassPrimaryConstructorsBeforeCSharp6{publicPrimaryConstructorsBeforeCSharp6(longpostId,stringpostName,stringpostTitle){PostID=postId;PostName=postName;PostTitle=postTitle;}publiclongPostID{get;set;}publicstringPostName{get;set;}publicstringPostTitle{get;set;}}   有了这个特性之后的方式publicclassPrimaryConstructorsInCSharp6(longpostId,stringpostName,stringpostTitle){publiclongPostID{get;}=postId;publicstringPostName{get;}=postName;publicstringPostTitle{get;}=postTitle;}

  在C#6中,主构造器为我们提供了使用参数定义构造器的一个简短语法.每个类只可以有一个主构造器.

  如果你观察上面的示例,会发现我们将参数初始化移动到了类名的旁边.

  你可能会得到下面这样的错误“Feature‘primaryconstructor’isonlyavailablein‘experimental’languageversion.”(主构造器特性只在实验性质的语言版本中可用),为了解决这个问题,我们需要编辑SolutionName.csproj文件,来规避这个错误.你所要做的就是在WarningTag后面添加额外的设置

LangVersionexperimental/LangVersion

  ‘主构造器’只在‘实验’性质的语言版本中可用

  3.字典初始化器   之前的方式

  编写一个字典初始化器的老办法如下

publicclassDictionaryInitializerBeforeCSharp6{publicDictionarystring,string_users=newDictionarystring,string(){{users,VenkatBagguBlog},{Features,WhatsnewinC#6}};}   有了这个特性之后的方式

  我们可以像数组里使用方括号的方式那样定义一个字典初始化器

publicclassDictionaryInitializerInCSharp6{publicDictionarystring,string_users{get;}=newDictionarystring,string(){[users]=VenkatBagguBlog,[Features]=WhatsnewinC#6};}   4.声明表达式   之前的方式publicclassDeclarationExpressionsBeforeCShapr6(){publicstaticintCheckUserExist(stringuserId){//Example1intid;if(!int.TryParse(userId,outid)){returnid;}returnid;}publicstaticstringGetUserRole(longuserId){////Example2varuser=_userRepository.Users.FindById(x=x.UserID==userId);if(user!=null){//workwithaddress...returnuser.City;}}}   有了这个特性之后的方式

  在C#6中你可以在表达式的中间声明一个本地变量.使用声明表达式我们还可以在if表达式和各种循环表达式中声明变量

publicclassDeclarationExpressionsInCShapr6(){publicstaticintCheckUserExist(stringuserId){if(!int.TryParse(userId,outvarid)){returnid;}return0;}publicstaticstringGetUserRole(longuserId){////Example2if((varuser=_userRepository.Users.FindById(x=x.UserID==userId)!=null){//workwithaddress...returnuser.City;}}}   5.静态的Using   之前的方式

  对于你的静态成员而言,没必要为了调用一个方法而去弄一个对象实例.你会使用下面的语法

7TypeName.MethodNamepublicclassStaticUsingBeforeCSharp6{publicvoidTestMethod(){Console.WriteLine(StaticUsingBeforeC#6);}}   之后的方式

  在C#6中,你不用类名就能使用静态成员.你可以在命名空间中引入静态类.

  如果你看了下面这个实例,就会看到我们将静态的Console类移动到了命名空间中

1usingSystem.Console;namespacenewfeatureincsharp6{publicclassStaticUsingInCSharp6{publicvoidTestMethod(){WriteLine(StaticUsingBeforeC#6);}}}   6.catch块里面的await

  C#6之前catch和finally块中是不能用await关键词的.在C#6中,我们终于可以再这两个地方使用await了.

try{//Dosomething}catch(Exception){awaitLogger.Error(exceptionlogging)}   7.异常过滤器

  异常过滤器可以让你在catch块执行之前先进行一个if条件判断.

  看看这个发生了一个异常的示例,现在我们想要先判断里面的Exception是否为null,然后再执行catch块

//示例1try{//Somecode}catch(Exceptionex)if(ex.InnerException==null){//Dowork}//BeforeC#6wewritetheabovecodeasfollows//示例1try{//Somecode}catch(Exceptionex){if(ex.InnerException!=null){//Dowork;}}   8.用于检查NULL值的条件访问操作符?.

  看看这个实例,我们基于UserID是否不为null这个条件判断来提取一个UserRanking.

  之前的方式9varuserRank=NoRank;if(UserID!=null){userRank=Rank;}//orvaruserRank=UserID!=null?Rank:NoRank   有了这个特性之后方式1varuserRank=UserID?.Rank??NoRank;

  C#6.0中的新特性第一次出现在VenkatBaggu博客上.









































北京正规的治疗白癜风医院
哪家医院治疗白癜风最专业

转载请注明原文网址:http://www.helimiaopu.com/jsyy/2717.html
------分隔线----------------------------