C# 6.0

  • Read-only auto-properties(只读自动属性)

以前版本,声明只读属性时,示例:

  1. public string FirstName { get; private set; }
  2. public string LastName { get; private set; }

6.0,不显示写setter即是只读属性,但属性也只能在构造函数中初始化了

示例:

  1. public string FirstName { get; }
  2. public string LastName { get; }
  • Auto-Property Initializers(自动属性初始化)

以前版本,属性的初始化需要放在构造函数中进行,6.0可以在属性声明时初始化

示例:

  1. public ICollection<double> Grades { get; } = new List<double>();
  2. public Standing YearInSchool { get; set;} = Standing.Freshman;
  • Expression-bodied function members(表达式体函数成员)

6.0可以直接在函数体使用表达式,这简化一些很简单的函数的书写(仅支持使用只读的属性)

示例:

  1. public override string ToString() => $"{LastName}, {FirstName}";
  2. public string FullName => $"{FirstName} {LastName}";
  • using static

可以直接引用具体对象,然后在本地直接使用其静态函数。

以前:

  1. using System;
  2.  
  3. namespace TestCsharp
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. Console.WriteLine("ok");
  10. }
  11. }
  12. }

6.0版本:

  1. using static System.Console;
  2.  
  3. namespace TestCsharp
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. WriteLine("ok");
  10. }
  11. }
  12. }
  • Null-conditional operators(空条件操作符)

更加简化的空对象判断,不为空可直接访问其属性

以前先判断对象不为空,再访问属性:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Person person = new Person();
  6.  
  7. var first = person == null ? "" : person.FirstName;
  8.  
  9. Console.WriteLine(first);
  10. }
  11. }
  12.  
  13. class Person
  14. {
  15. public string FirstName { get; set; }
  16.  
  17. public Person()
  18. {
  19. FirstName = "init name";
  20. }
  21. }

  

6.0版本,直接替换属性访问 . 为 ?. 一步完成判断和访问:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Person person = new Person();
  6.  
  7. var first = person?.FirstName;
  8.  
  9. Console.WriteLine(first);
  10. }
  11. }
  12.  
  13. class Person
  14. {
  15. public string FirstName { get; set; }
  16.  
  17. public Person()
  18. {
  19. FirstName = "init name";
  20. }
  21. }
  • String interpolation(字符串插值)

以前,字符串拼接时,要使用string.Format,示例:

  1. public string FullName
  2. {
  3. get
  4. {
  5. return string.Format("Name is{0} {1}", FirstName, LastName);
  6. }
  7. }

6.0可以直接使用$代替string.Format,示例:

  1. public string FullName
  2. {
  3. get
  4. {
  5. return $"Name is {FirstName}{LastName}";
  6. }
  7. }

 进一步,可以在其中使用 : 标示格式化风格,如下,F2标识两位小数,示例:

  1. public string GetGradePointPercentage() =>
  2. $"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average():F2}";
  • Exception Filters(异常过滤器)

增加过滤器,直接在异常捕获后就可以进行相应的判断

以前:

  1. public static async Task<string> MakeRequest()
  2. {
  3. var client = new System.Net.Http.HttpClient();
  4. var streamTask = client.GetStringAsync("https://localHost:10000");
  5. try {
  6. var responseText = await streamTask;
  7. return responseText;
  8. } catch (System.Net.Http.HttpRequestException e)
  9. {
  10. if (e.Message.Contains("301"))
  11. return "Site Moved";
  12. else
  13. throw;
  14. }
  15. }

6.0版本,在外部使用when进行条件匹配:

  1. public static async Task<string> MakeRequest()
  2. {
  3. var client = new System.Net.Http.HttpClient();
  4. var streamTask = client.GetStringAsync("https://localHost:10000");
  5. try {
  6. var responseText = await streamTask;
  7. return responseText;
  8. } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
  9. {
  10. return "Site Moved";
  11. }
  12. }
  • nameof Expressions

主要场景是异常中提供名字:

  1. if (IsNullOrWhiteSpace(lastName))
  2. throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));

  还有就是MVVM中INotifyPropertyChanged实现:

  1. public string LastName
  2. {
  3. get { return lastName; }
  4. set
  5. {
  6. if (value != lastName)
  7. {
  8. lastName = value;
  9. PropertyChanged?.Invoke(this,
  10. new PropertyChangedEventArgs(nameof(LastName)));
  11. }
  12. }
  13. }
  14. private string lastName;
  • Await in Catch and Finally blocks

版本5中对await的使用做了一些限制,6中去除了这些限制。

示例:

  1. public static async Task<string> MakeRequestAndLogFailures()
  2. {
  3. await logMethodEntrance();
  4. var client = new System.Net.Http.HttpClient();
  5. var streamTask = client.GetStringAsync("https://localHost:10000");
  6. try {
  7. var responseText = await streamTask;
  8. return responseText;
  9. } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
  10. {
  11. await logError("Recovered from redirect", e);
  12. return "Site Moved";
  13. }
  14. finally
  15. {
  16. await logMethodExit();
  17. client.Dispose();
  18. }
  19. }
  • Index Initializers

之前版本示例:

  1. private List<string> messages = new List<string>
  2. {
  3. "Page not Found",
  4. "Page moved, but left a forwarding address.",
  5. "The web server can't come out to play today."
  6. };

6.0版本:

  1. private Dictionary<int, string> webErrors = new Dictionary<int, string>
  2. {
  3. [404] = "Page not Found",
  4. [302] = "Page moved, but left a forwarding address.",
  5. [500] = "The web server can't come out to play today."
  6. };
  • Extension Add methods in collection inializers

假定有以下一个类,Enroll添加对象到集合中:

  1. public class Enrollment : IEnumerable<Student>
  2. {
  3. private List<Student> allStudents = new List<Student>();
  4.  
  5. public void Enroll(Student s)
  6. {
  7. allStudents.Add(s);
  8. }
  9.  
  10. public IEnumerator<Student> GetEnumerator()
  11. {
  12. return ((IEnumerable<Student>)allStudents).GetEnumerator();
  13. }
  14.  
  15. IEnumerator IEnumerable.GetEnumerator()
  16. {
  17. return ((IEnumerable<Student>)allStudents).GetEnumerator();
  18. }
  19. }

以前版本,你只能过显示调用Enroll方法,一个个添加对象。

  1. var classList = new Enrollment();
  2. classList.Enroll(new Student("Lessie", "Crosby"));

6.0增加了Add方法,允许通过扩展方法的形式调用Enroll,进行可以用构造函数直接添加对象。

示例:

  1. public static class StudentExtensions
  2. {
  3. public static void Add(this Enrollment e, Student s) => e.Enroll(s);
  4. }

  然后,就可以通过构造函数来直接绑定对象了。如下:

  1. var classList = new Enrollment()
  2. {
  3. new Student("Lessie", "Crosby"),
  4. new Student("Vicki", "Petty"),
  5. new Student("Ofelia", "Hobbs"),
  6. new Student("Leah", "Kinney"),
  7. new Student("Alton", "Stoker"),
  8. new Student("Luella", "Ferrell"),
  9. new Student("Marcy", "Riggs"),
  10. new Student("Ida", "Bean"),
  11. new Student("Ollie", "Cottle"),
  12. new Student("Tommy", "Broadnax"),
  13. new Student("Jody", "Yates"),
  14. new Student("Marguerite", "Dawson"),
  15. new Student("Francisca", "Barnett"),
  16. new Student("Arlene", "Velasquez"),
  17. new Student("Jodi", "Green"),
  18. new Student("Fran", "Mosley"),
  19. new Student("Taylor", "Nesmith"),
  20. new Student("Ernesto", "Greathouse"),
  21. new Student("Margret", "Albert"),
  22. new Student("Pansy", "House"),
  23. new Student("Sharon", "Byrd"),
  24. new Student("Keith", "Roldan"),
  25. new Student("Martha", "Miranda"),
  26. new Student("Kari", "Campos"),
  27. new Student("Muriel", "Middleton"),
  28. new Student("Georgette", "Jarvis"),
  29. new Student("Pam", "Boyle"),
  30. new Student("Deena", "Travis"),
  31. new Student("Cary", "Totten"),
  32. new Student("Althea", "Goodwin")
  33. };

  

  • Improved overload resolution

针对Task.Run()进行了优化,之前版本不能正确的区分重载Task.Run(Action)和Task.Run(Func<Task>())

当以下场景时:

  1. static Task DoThings()
  2. {
  3. return Task.FromResult(0);
  4. }

  之前版本,只能写成:

  1. Task.Run(() => DoThings());

  6.0就可以正确的写成:

  1. Task.Run(DoThings);

  

参考:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/whats-new/csharp-6

回顾C#各版本特性的更多相关文章

  1. Java14版本特性【一文了解】

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  2. Android各版本特性

    此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...

  3. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  4. C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系

    C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...

  5. [转帖]sql server版本特性简介、版本介绍简介

    sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...

  6. Python 如何移除旧的版本特性,如何迎接新的特性?

    2020 年 4 月 20 日,Python 2 的最后一个版本 2.7.18 发布了,这意味着 Python 2 是真正的 EOL(end of life)了,一个时代终于落幕了. Python 2 ...

  7. 全网最通透的Java8版本特性讲解

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  8. 一篇文章看懂spark 1.3+各版本特性

    Spark 1.6.x的新特性Spark-1.6是Spark-2.0之前的最后一个版本.主要是三个大方面的改进:性能提升,新的 Dataset API 和数据科学功能的扩展.这是社区开发非常重要的一个 ...

  9. php不同版本特性记录

    最近在用php开发时项目中遇到了版本问题,特此记录下php不同版本的一些特性记录,以备忘. 一:php5.3中的新特性 1)开始支持命名空间(Namespace) 2)支持延迟静态绑定(Late St ...

随机推荐

  1. 提效工具-python解析xmind文件及xmind用例统计

    现状 每个公司都有一个维护测试case的系统,有自研的也有买的,比如QC, 禅道等等,QA往往习惯使用xmind等思维导图工具来编写测试用例,因为思路清晰,编写方便,那么这就有一个问题,大多公司要求所 ...

  2. Python-SyntaxError: invalid syntax

    Error:  SyntaxError: invalid syntax Where? 运行Python代码时候,提示错误 Way? Python def class if elif for while ...

  3. SpringBoot2.3中@Async实现异步

    启动加上@EnableAsync ,需要执行异步方法上加入@Async. 在方法上加上@Async之后 底层使用多线程技术. 不使用异步 先关代码: package com.yiyang.myfirs ...

  4. 【Python】类

    初探类 类定义与函数定义( def语句 )一样必须被执行才会起作用 调用 x.f() 其实就相当于 MyClass.f(x) 补充说明 数据属性会覆盖掉具有相同名称的方法属性 命名方法 方法名称使用大 ...

  5. 【随笔】菜刀(代码执行)函数和命令执行函数详解及Getshell方法

    代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时间弄,直到前两天碰上一个写入了菜刀马但是死活连不上菜刀的站,顿时不知道怎么继续了,所以就趁这个机会整理了一下代码执行函数怎么get ...

  6. C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous

    转载:https://www.cnblogs.com/emanlee/archive/2010/10/16/1852998.html 用VC++ 2008 编写C语言程序,编译出现错误: 预编译头文件 ...

  7. c++中 #define和const的区别

    来源参考:https://blog.csdn.net/yi_ming_he/article/details/70405364 这个区别用从几个角度来说: 角度1: 就定义常量说的话:  const 定 ...

  8. 【题解】[USACO07OPEN]Dining G

    \(Link\) \(\text{Solution:}\) 这一题,我们要做到,食物和牛.牛和饮料均为一对一的关系.我们发现这个图不好建立. 经典技巧:将牛拆边,拆成入点和出点,并连容量为\(1\)的 ...

  9. linux 内核参数设置 - sysctl

    sysctl 命令用于查看和修改内核参数 查看指定参数: sysctl kernel.threads-max 查看所有参数: sysctl -a 修改指定参数: sysctl -w kernel.th ...

  10. 微信小程序 audio组件 默认控件 无法隐藏/一直显示/改了controls=‘false’也没用2019/5/28

    <audio>默认控件,如果需要隐藏,不需要特意设置controls = 'false',直接把这个属性删除即可,不然无论如何都会存在 之前,设置了controls = 'false' & ...