如今, C# 8.0 伴随着 .NET Core 3.0 正式发布(2019年9月23日),本文沿着之前文章的内容一览 C# 8.0 的新特性。
1、Readonly members / 只读成员
可将readonly修饰符应用于结构的任何成员。
2、Default interface members / 默认接口成员
现在可以为接口的成员添加默认的实现。
3、Pattern matching enhancements / 模式匹配增强
a)Switch expressions / Switch 表达式
b)Property patterns / 属性模式
c)Tuple patterns / 元组模式
d)Positional patterns / 位置模式
4、Using declarations / Using 声明
using 声明是指使用using关键字的变量声明。它指示编译器声明的变量应在作用域末尾进行 dispose。
5、Static local functions / 静态本地函数
现在可以向本地函数添加static修饰符,以确保本地函数不会从封闭范围捕获(引用)任何变量。
6、Disposable ref structs / 可处置的 ref 结构
用ref修饰符声明的struct可能无法实现任何接口,因此无法实现IDisposable。因此,要能够处理ref struct,它必须有一个可访问的void Dispose()方法。这同样适用于 readonly ref struct声明。
7、Nullable reference types / Nullable 引用类型
C# 8.0 中你可以使用项目文件中的配置“<Nullable>enable</Nullable>”或者使用 #nullable 上下文声明来使得引用类型像值类型一样不可为空,这种情况下你就可以使用 Nullable 引用类型,用法与 Nullable 值类型是一样的。
8、Asynchronous streams / 异步流
从 C# 8.0 开始,你可以创建和使用异步流。 一个返回异步流的方法有三个特点:
- 用
async修饰符声明的。 - 返回
IAsyncEnumerable<T>。 - 包含了用于在异步流中返回连续元素的
yield return语句。
9、Indices and ranges / 索引和范围
索引和范围为访问序列中的单个元素或范围提供了简洁的语法,比如可以"^"操作符从尾部开始索引。
10、 Null-coalescing assignment / Null合并赋值
C# 8.0 引入了 null 合并赋值运算符??=。仅当运算符左边计算结果为null时,才能使运算符??=右边的值分配给左边的变量。
11、Unmanaged constructed types / 非托管构造类型
在 C# 7.3 和更早版本中,构造类型(包含至少一个泛型类型参数的类型)不能为非托管类型。从 C# 8.0 开始,如果一个构造的值类型的成员均为非托管类型,那么该类型为非托管类型。
12、stackalloc in nested expressions / 嵌套表达式中的 stackalloc
从 C# 8.0 开始,如果stackalloc表达式的结果为System.Span<T>或System.ReadOnlySpan<T>类型,就可以在其他表达式中内嵌使用stackalloc表达式。
13、Enhancement of interpolated verbatim strings / 内插逐字字符串的增强功能
内插逐字字符串中$和@标记的顺序可以任意安排:$@"..."和@$"..."均为有效的内插逐字字符串。在早期 C# 版本中,$标记必须出现在@标记之前。