回顾C#各版本特性

C# 6.0

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

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

public string FirstName { get; private set; }
public string LastName { get; private set; }

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

示例:

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

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

示例:

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

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

示例:

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

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

以前:

using System;

namespace TestCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ok");
        }
    }
}

6.0版本:

using  static System.Console;

namespace TestCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("ok");
        }
    }
}
  • Null-conditional operators(空条件操作符)

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

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

class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();

            var first = person == null ? "" : person.FirstName;

            Console.WriteLine(first);
        }
    }

    class Person
    {
        public string FirstName { get; set; }

        public Person()
        {
            FirstName = "init name";
        }
    }

  

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

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();

            var first = person?.FirstName;

            Console.WriteLine(first);
        }
    }

    class Person
    {
        public string FirstName { get; set; }

        public Person()
        {
            FirstName = "init name";
        }
    }
  • String interpolation(字符串插值)

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

public string FullName
{
    get
    {
        return string.Format("Name is{0} {1}", FirstName, LastName);
    }
}

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

        public string FullName
        {
            get
            {
                return $"Name is {FirstName}{LastName}";
            }
        }

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

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

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

以前:

public static async Task<string> MakeRequest()
{
    var client = new System.Net.Http.HttpClient();
    var streamTask = client.GetStringAsync("https://localHost:10000");
    try {
        var responseText = await streamTask;
        return responseText;
    } catch (System.Net.Http.HttpRequestException e)
    {
        if (e.Message.Contains("301"))
            return "Site Moved";
        else
            throw;
    }
}

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

public static async Task<string> MakeRequest()
{
    var client = new System.Net.Http.HttpClient();
    var streamTask = client.GetStringAsync("https://localHost:10000");
    try {
        var responseText = await streamTask;
        return responseText;
    } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
    {
        return "Site Moved";
    }
}
  • nameof Expressions

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

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

  还有就是MVVM中INotifyPropertyChanged实现:

public string LastName
{
    get { return lastName; }
    set
    {
        if (value != lastName)
        {
            lastName = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(LastName)));
        }
    }
}
private string lastName;
  • Await in Catch and Finally blocks

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

示例:

public static async Task<string> MakeRequestAndLogFailures()
{
    await logMethodEntrance();
    var client = new System.Net.Http.HttpClient();
    var streamTask = client.GetStringAsync("https://localHost:10000");
    try {
        var responseText = await streamTask;
        return responseText;
    } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
    {
        await logError("Recovered from redirect", e);
        return "Site Moved";
    }
    finally
    {
        await logMethodExit();
        client.Dispose();
    }
}
  • Index Initializers

之前版本示例:

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

6.0版本:

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

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

public class Enrollment : IEnumerable<Student>
{
    private List<Student> allStudents = new List<Student>();

    public void Enroll(Student s)
    {
        allStudents.Add(s);
    }

    public IEnumerator<Student> GetEnumerator()
    {
        return ((IEnumerable<Student>)allStudents).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable<Student>)allStudents).GetEnumerator();
    }
}

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

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

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

示例:

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

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

var classList = new Enrollment()
        {
            new Student("Lessie", "Crosby"),
            new Student("Vicki", "Petty"),
            new Student("Ofelia", "Hobbs"),
            new Student("Leah", "Kinney"),
            new Student("Alton", "Stoker"),
            new Student("Luella", "Ferrell"),
            new Student("Marcy", "Riggs"),
            new Student("Ida", "Bean"),
            new Student("Ollie", "Cottle"),
            new Student("Tommy", "Broadnax"),
            new Student("Jody", "Yates"),
            new Student("Marguerite", "Dawson"),
            new Student("Francisca", "Barnett"),
            new Student("Arlene", "Velasquez"),
            new Student("Jodi", "Green"),
            new Student("Fran", "Mosley"),
            new Student("Taylor", "Nesmith"),
            new Student("Ernesto", "Greathouse"),
            new Student("Margret", "Albert"),
            new Student("Pansy", "House"),
            new Student("Sharon", "Byrd"),
            new Student("Keith", "Roldan"),
            new Student("Martha", "Miranda"),
            new Student("Kari", "Campos"),
            new Student("Muriel", "Middleton"),
            new Student("Georgette", "Jarvis"),
            new Student("Pam", "Boyle"),
            new Student("Deena", "Travis"),
            new Student("Cary", "Totten"),
            new Student("Althea", "Goodwin")
        };

  

  • Improved overload resolution

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

当以下场景时:

static Task DoThings()
{
     return Task.FromResult(0);
}

  之前版本,只能写成:

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

  6.0就可以正确的写成:

Task.Run(DoThings);

  

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

时间: 2024-07-30 07:02:51

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

C#各版本特性

C#2.0 泛型,可空类型,匿名方法,更方便的委托,迭代器,分布类型,静态类,包含不同访问修饰符的属性的取值和赋值方法,命名空间别名,pragma指令,固定大小的缓冲器. C#3.0 LINQ,自动属性,var,对象和集合的初始化器,匿名类型,Lambda表达式,扩展方法 C#4.0 可选参数,命名参数,更好的COM交互,泛型的逆变与协变,动态类型 C#5.0 async,await C#6.0 ...... C#各版本特性,布布扣,bubuko.com

Android各版本特性

此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. Android5.0(棒棒糖) 1)运行时机制,采用ART.安装时转换为机器语言,成为真正本地应用 2)新推出Material Design,用户切换Activity时候无缝过渡位移动画 3)通知详情可以用户自己设计 官网:https://developer.android.com/about/ve

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

Spark 1.6.x的新特性Spark-1.6是Spark-2.0之前的最后一个版本.主要是三个大方面的改进:性能提升,新的 Dataset API 和数据科学功能的扩展.这是社区开发非常重要的一个里程碑.1. 性能提升根据 Apache Spark 官方 2015 年 Spark Survey,有 91% 的用户想要提升 Spark 的性能.Parquet 性能自动化内存管理流状态管理速度提升 10X 2. Dataset APISpark 团队引入了 DataFrames,新型Datase

java版本特性总结

学java这么久,对其每个版本的特性不是怎么了解,今天总结一下. 1.4: java NIO,基于多路复用技术(基于IO) 1.5 枚举.foreach.static导入 范型(重要) 注解(配置文件作用) 线程池以及同步库(并发) 1.6 主要是简化webservice的开发的改进 awt:DesKtop,SystemTry JAXB2.0(stax解析xml)  ----OXM(xtreame,castor) 注意: DOM解析:基于内存树 sax解析:基于事件(推模式)---事件--程序(

iOS及历史版本特性介绍

iOS是apple公司的移动操作系统,在iPhone,iPad,iPod中应用,该名最初为Cisco的网络设备操作系统,后授权于Apple公司使用.下面介绍历史版本的特性. iOS1 最大特性是具有其他手机无法比拟的触屏功能,使捏拉缩放和慢性滚动变得近乎完美.从而使应用的体验变得更加自然而即时. 缺点:1.不支持复制/粘贴文本. 2.无法在发邮件时添加附件.                3.不支持彩信功能. 4.Exchange邮件推送.    5.可自定义的主屏幕. tethering.可见

C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)

历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA发布的最新规范,C# 6.0还是草案阶段,C# 7.1是微软当前提供的最新规范. 这里仅仅列个提纲,由于C# 5.0是具有ECMA标准规范的版本,所以选择C# 5.0作为主要版本学习,并专题学习C# 6.0,7.0版本新特性. C#语言规范GitHub库参见:https://github.com/

C# 语言历史版本特性(C# 1.0到C# 8.0汇总)

历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA发布的最新规范,C# 6.0还是草案阶段,C# 7.1是微软当前提供的最新规范. 这里仅仅列个提纲,由于C# 5.0是具有ECMA标准规范的版本,所以选择C# 5.0作为主要版本学习,并专题学习C# 6.0,7.0版本新特性. C#语言规范GitHub库参见:https://github.com/

sql server版本特性简介、版本介绍简介

1.SQL Server 版本简介 1.1.sql server的版本信息 年    代 版    本 大版本号 1993年 SQL Server for Windows NT 4.21 1994年 SQL Server for Windows NT 4.21a 1995年 SQL Server 6.0 1996年 SQL Server 6.5 1998年 SQL Server 7.0 7.00 2000年 SQL Server 2000 8.00 2003年 SQL Server 2000 E

Java各版本特性一览-从Java1.0到Java12

JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.1 1997-02-19 – JDBC(Java DataBase Connectivity); – 支持内部类; – RMI(Remote Method Invocation) ; – 反射; – Java Bean; JDK Version 1.2 1998-12-08 Playground(操场) – 集合