C# 6.0 的新特性

 本文的内容包括引入C#6.0中的新的语言特性有哪些. 还有已经被引入的代码名称为 “Roslyn”新编译器. 编译器是开放源码的,并且可以从 codeplex 网站的这个地址下载到源代码: https://roslyn.codeplex.com/.

 C# 6.0 中的新特性

  我们可以对这些新特性一个一个的进行讨论,而首先要列出 C# 6.0 中这些特性的一个清单

  1. 自动的属性初始化器 Auto Property Initializer
  2. 主构造器 Primary Consturctor
  3. 字典初始化器 Dictionary Initializer
  4. 声明表达式 Declaration Expression
  5. 静态的Using Static Using
  6. catch 块中的 await
  7. 异常过滤器 Exception Filter
  8. 用于检查NULL值的条件访问操作符

  1. 自动的属性初始化器Auto Property initialzier

  之前的方式

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class AutoPropertyBeforeCsharp6

{

    private string _postTitle = string.Empty;

    public AutoPropertyBeforeCsharp6()

    {

        //assign initial values

        PostID = 1;

        PostName = "Post 1";

    }

    public <span id="8_nwp" style="width: auto; height: auto; float: none;"><a id="8_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?c=news&cf=1001&ch=0&di=128&fv=11&jk=e73d8e665ea45c13&k=long&k0=long&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=135ca45e668e3de7&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6014%2Ehtml&urlid=0" target="_blank" mpid="8" style="text-decoration: none;"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">long</span></a></span> PostID { get; set; }

    public string PostName { get; set; }

    public string PostTitle

    {

        get { return _postTitle; }

        protected set

        {

            _postTitle = value;

        }

    }

}

  有了这个特性之后的方式

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


1

2

3

4

5

6

7

8

public class AutoPropertyInCsharp6

{

    public long PostID { get;  } = 1;

    public string PostName { get; } = "Post 1";

    public string PostTitle { get; protected set; } = string.Empty;

}

 2. 主构造器

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

  之前的方式


1

2

3

4

5

6

7

8

9

10

11

12

13

public class PrimaryConstructorsBeforeCSharp6

{

    public PrimaryConstructorsBeforeCSharp6(long postId, string postName, string postTitle)

    {

        PostID = postId;

        PostName = postName;

        PostTitle = postTitle;

    }

    public <span id="7_nwp" style="width: auto; height: auto; float: none;"><a id="7_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?c=news&cf=1001&ch=0&di=128&fv=11&jk=e73d8e665ea45c13&k=long&k0=long&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=135ca45e668e3de7&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6014%2Ehtml&urlid=0" target="_blank" mpid="7" style="text-decoration: none;"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">long</span></a></span> PostID { get; set; }

    public string PostName { get; set; }

    public string PostTitle { get; set; }

}

  有了这个特性之后的方式


1

2

3

4

5

6

public class PrimaryConstructorsInCSharp6(<span id="6_nwp" style="width: auto; height: auto; float: none;"><a id="6_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?c=news&cf=1001&ch=0&di=128&fv=11&jk=e73d8e665ea45c13&k=long&k0=long&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=135ca45e668e3de7&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6014%2Ehtml&urlid=0" target="_blank" mpid="6" style="text-decoration: none;"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">long</span></a></span> postId, string postName, string postTitle)

{       

    public long PostID { get;  } = postId;

    public string PostName { get; } = postName;

    public string PostTitle { get;  } = postTitle;

}

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

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

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

<LangVersion>experimental</LangVersion>

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

  3. 字典初始化器

  之前的方式

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


1

2

3

4

5

6

7

8

public class DictionaryInitializerBeforeCSharp6

{

    public Dictionary<string, string> _users = new Dictionary<string, string>()

    {

        {"users", "Venkat Baggu Blog" },

        {"Features", "Whats new in C# 6" }

    };

}

  有了这个特性之后的方式

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


1

2

3

4

5

6

7

8

public class DictionaryInitializerInCSharp6

{

    public Dictionary<string, string> _users { get; } = new Dictionary<string, string>()

    {

        ["users"]  = "Venkat Baggu Blog",

        ["Features"] =  "Whats new in C# 6"

    };

}

  4. 声明表达式

  之前的方式


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public class DeclarationExpressionsBeforeCShapr6()

{

    public static int CheckUserExist(string userId)

    {

        //Example 1

        int id;

        if (!int.TryParse(userId, out id))

        {

            return id;

        }

        return id;

    }

    public static string GetUserRole(<span id="5_nwp" style="width: auto; height: auto; float: none;"><a id="5_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?c=news&cf=1001&ch=0&di=128&fv=11&jk=e73d8e665ea45c13&k=long&k0=long&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=135ca45e668e3de7&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6014%2Ehtml&urlid=0" target="_blank" mpid="5" style="text-decoration: none;"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">long</span></a></span> userId)

    {

        ////Example 2

        var user = _userRepository.Users.FindById(x => x.UserID == userId);

        if (user!=null)

        {

            // work with address ...

            return user.City;

        }

    }

}

  有了这个特性之后的方式

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class DeclarationExpressionsInCShapr6()

{

    public static int CheckUserExist(string userId)

    {

        if (!int.TryParse(userId, out var id))

        {

            return id;

        }

        return 0;

    }

    public static string GetUserRole(<span id="3_nwp" style="width: auto; height: auto; float: none;"><a id="3_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?c=news&cf=1001&ch=0&di=128&fv=11&jk=e73d8e665ea45c13&k=long&k0=long&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=135ca45e668e3de7&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6014%2Ehtml&urlid=0" target="_blank" mpid="3" style="text-decoration: none;"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">long</span></a></span> userId)

    {

        ////Example 2

        if ((var user = _userRepository.Users.FindById(x => x.UserID == userId) != null)

        {

            // work with address ...

            return user.City;

        }

    }

}

  5. 静态的 Using

  之前的方式

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


1

2

3

4

5

6

7

TypeName.MethodNamepublic class StaticUsingBeforeCSharp6

{

    public void TestMethod()

    {

        Console.WriteLine("Static Using Before C# 6");

    }

}

  之后的方式

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

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


1

2

3

4

5

6

7

8

9

10

11

using System.Console;

namespace newfeatureincsharp6

{

    public class StaticUsingInCSharp6

    {

        public void TestMethod()

        {

            WriteLine("Static Using Before C# 6");

        }

    }

}

  6. catch块里面的await

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


1

2

3

4

5

6

7

8

try

{         

  //Do something

}

catch (Exception)

{

  await Logger.Error("exception logging")

}

  7. 异常过滤器

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//示例 1

try

{

    //Some code

}

catch (Exception ex) if (ex.InnerException == null)

{

    //Do work

}

//Before C# 6 we write the above code as follows

//示例 1

try

{

    //Some code

}

catch (Exception ex)

{

    if(ex.InnerException != null)

    {

        //Do work;

    }

}

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

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

  之前的方式


1

2

3

4

5

6

7

8

9

var userRank = "No Rank";

if(UserID != null)

{

    userRank = Rank;

}

//or

var userRank = UserID != null ? Rank : "No Rank"

  有了这个特性之后方式


1

var userRank = UserID?.Rank ?? "No Rank";

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

  原文地址:http://www.codeproject.com/Articles/874205/New-features-in-Csharp

时间: 2024-10-21 15:28:10

C# 6.0 的新特性的相关文章

Atitit jquery &#160;1.4--v1.11 &#160;v1.12 &#160;v2.0 &#160;3.0 的新特性

Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.html   2016.11 1.1.1. jQuery.htmlPrefilter()1 1.2. 2016.7  jq3.0 新特性1 1.3. Jq3.1新特性 jQuery 3.1.1 发布了,该版本包括一些 BUG 修复和改进.3 1.1. Jquery1.12  jQuery 2.2 和

相比于python2.6,python3.0的新特性。

这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法.例如: Old: print "The answer is", 2*2 New: print("The answer is", 2*2) Old: print x,       

C# 6.0语法新特性体验(二)

之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性,现在随着Visual Studio 14 CTP3的发布,又陆续可以体验一些新的特性了,这里简单的介绍一下之前没有介绍的新语法. 属性表达式(Property Expressions) 我们常常会在类中写一些通过函数生成的只读属性: ????class Point????{????????public int X { get; set; }????????public int Y { get; set; }

在Visual Studio 14 CTP中启用C# 6.0的新特性

今天看到Visual Studio 14 CTP版本已经发布了,支持了一些c++ 及C# 6.0的新特性,便下载下了尝鲜试了一下. C++到还好,使用C#的新特性就有点麻烦了,需要在csproj文件中加上这样一行才能使用     <LangVersion>experimental</LangVersion> 最开始我想写个VS插件来弄下.试了下找不到啥相关的API,便改写了一个小程序来转换它,使用了后还是觉得但文件太多时候很麻烦. 就干脆写了一个小程序把所有的模板中都添加了这一项,

安卓6.0(棉花糖)新特性汇总

安卓6.0(棉花糖)新特性汇总 Android伴随着众多新特性和新功能,Android6.0(API level 23)在系统和API上都有着诸多的改变. 1.App Permissions(软件权限管理) 在安卓6.0里,应用许可提示可以自定义了.它允许对应用的权限进行高度管理,比如应用能否使用位置.相机.麦克风.通讯录等,这些都可以开放给开发者和用户. 作为开发者,当你的app的目标版本(target)为Android6.0(API 23)或更高时,请确保在运行时进行权限的检查和请求.其中,

OSChina 技术周刊第二十四期 —— C# 6.0 的新特性

每周技术抢先看,总有你想要的! 移动开发 [博客]Swift社交应用文本输入优化汇总 服务端开发/管理 [翻译]HTTP/1 的最佳实践并不适合 HTTP/2 [翻译]使用 AppDomain 存储实现大数据集合 [翻译]AngularJS 对比 React [软件]PHP 论坛软件 PHPHub [软件]监控和告警系统 Bosun [软件]多主机容器网络 SocketPlane [博客]Django学习笔记 [博客]Tornado源码分析-Web Framework [博客]话说对 Hiber

servlet3.0 的新特性之二注解代替了web.xml配置文件

servlet3.0 的新特性: 注解代替了 web.xml 文件 支持了对异步的处理 对上传文件的支持 1.注解代替了配置文件 1.删除了web.xml 文件 2. 在Servlet类上添加@WebServlet(urlPatterns={"/AServlet"}) 3. 在Filter类上添加@WebFilter(urlPatterns="/AFilter") 4. 在Listener类上添加@WebListener ? 总结: * 注解好处:配置信息少,使用很

C# 6.0/7.0 的新特性

转眼C#语言都已经迭代到7.0版本了,很多小伙伴都已经把C# 7.0 的新特性应用到代码中了,想想自己连6.0的新特性都还很少使用,今天特意搜集了一下6.0和7.0的一些新特性,记录一下,方便查阅. C# 7.0 新特性 增强的ref 可以对值变量传递引用 ref int b = ref a; 可以对返回值返回引用 return ref x; 自动创建 out 变量 增强的元组(需要扩展包支持,Install-Package System.ValueTuple) 命名返回值 (int a, in

C# 3.0的新特性

自动属性. 之前定义属性的步骤: private filed + public property. 现在的形式:int id{get;set;}. 可以分别设置get/set的保护级别(protected/public/private/internal). 系统自动生成一个private的字段,并暴露响应的get/set访问器. 对于Property内定义操作的限定 应该能够立即返回.不能把Timer的操作定义在其内. 匿名类型var var声明仅限于局部变量,不能用于字段上. 编译器根据初始化

探秘C# 6.0 的新特性

C# 6.0 中的新特性 我们可以对这些新特性一个一个的进行讨论,而首先要列出 C# 6.0 中这些特性的一个清单 自动的属性初始化器 Auto Property Initializer 主构造器 Primary Consturctor 字典初始化器 Dictionary Initializer 声明表达式 Declaration Expression 静态的Using Static Using catch 块中的 await 异常过滤器 Exception Filter 用于检查NULL值的条