C# 8.0 向 C# 语言添加了以下功能和增强功能:
- Readonly 成员
- 默认接口方法
- 模式匹配增强功能: Switch 表达式 属性模式 元组模式 位置模式
- Using 声明
- 静态本地函数
- 可处置的 ref 结构
- 可为空引用类型
- 异步流
- 异步可释放
- 索引和范围
- Null 合并赋值
- 非托管构造类型
- 嵌套表达式中的 Stackalloc
- 内插逐字字符串的增强功能
本文的剩余部分将简要介绍这些功能 。如果有详细讲解的文章,则将提供指向这些教程和概述的链接 。可以使用 dotnet try 全局工具在环境中浏览这些功能:
- 安装 dotnet-try 全局工具 。
- 克隆 dotnet/try-samples 存储库 。
- 将当前目录设置为 try-samples 存储库的 csharp8 子目录。
- 运行 dotnet try 。
C#
public struct Point{public double X { get; set; }public double Y { get; set; }public double Distance => Math.Sqrt(X * X + Y * Y);public override string ToString() =>$"({X}, {Y}) is {Distance} from the origin";}
与大多数结构一样,ToString() 方法不会修改状态 。可以通过将 readonly 修饰符添加到 ToString() 的声明来对此进行指示:C#
public readonly override string ToString() =>$"({X}, {Y}) is {Distance} from the origin";
上述更改会生成编译器警告,因为 ToString 访问未标记为 readonly 的 Distance 属性:控制台
warning CS8656: Call to non-readonly member 'Point.Distance.get' from a 'readonly' member results in an implicit copy of 'this'
需要创建防御性副本时,编译器会发出警告 。Distance 属性不会更改状态,因此可以通过将 readonly 修饰符添加到声明来修复此警告:C#
public readonly double Distance => Math.Sqrt(X * X + Y * Y);
请注意,readonly 修饰符对于只读属性是必需的 。编译器会假设 get 访问器可以修改状态;必须显式声明 readonly 。自动实现的属性是一个例外;编译器会将所有自动实现的 Getter 视为 readonly,因此,此处无需向 X 和 Y 属性添加 readonly 修饰符 。编译器确实会强制执行 readonly 成员不修改状态的规则 。除非删除 readonly 修饰符,否则不会编译以下方法:
C#
public readonly void Translate(int xOffset, int yOffset){X += xOffset;Y += yOffset;}
通过此功能,可以指定设计意图,使编译器可以强制执行该意图,并基于该意图进行优化 。有关详细信息,请参阅结构类型一文中的 readonly 实例成员部分 。
默认接口方法现在可以将成员添加到接口,并为这些成员提供实现 。借助此语言功能,API 作者可以将方法添加到以后版本的接口中,而不会破坏与该接口当前实现的源或二进制文件兼容性 。现有的实现继承默认实现 。此功能使 C# 与面向 Android 或 Swift 的 API 进行互操作,此类 API 支持类似功能 。默认接口方法还支持类似于“特征”语言功能的方案 。
默认接口方法会影响很多方案和语言元素 。我们的第一个教程介绍如何使用默认实现更新接口 。其他教程和参考更新将适时公开发布 。
在更多位置中使用更多模式模式匹配提供了在相关但不同类型的数据中提供形状相关功能的工具 。C# 7.0 通过使用 is 表达式和 switch 语句引入了类型模式和常量模式的语法 。这些功能代表了支持数据和功能分离的编程范例的初步尝试 。随着行业转向更多微服务和其他基于云的体系结构,还需要其他语言工具 。
C# 8.0 扩展了此词汇表,这样就可以在代码中的更多位置使用更多模式表达式 。当数据和功能分离时,请考虑使用这些功能 。当算法依赖于对象运行时类型以外的事实时,请考虑使用模式匹配 。这些技术提供了另一种表达设计的方式 。
除了可以在新位置使用新模式之外,C# 8.0 还添加了“递归模式” 。任何模式表达式的结果都是一个表达式 。递归模式只是应用于另一个模式表达式输出的模式表达式 。
switch 表达式通常情况下,switch 语句在其每个 case 块中生成一个值 。借助 Switch 表达式,可以使用更简洁的表达式语法 。只有些许重复的 case 和 break 关键字和大括号 。以下面列出彩虹颜色的枚举为例:
推荐阅读
- 韵达物流在行业中的具体优势
- 老竹大方的产地,大方茶中的上品顶谷大方茶
- 王熙凤是红楼梦中的人物吗 红楼梦里的王熙凤是什么样的人
- 四大凶兽中的混沌 穷奇,饕餮,梼杌,混沌那个最厉害
- 红楼梦中的袭人是一个什么样的人 红楼梦中对袭人的评价
- Java开发中的支付业务简易流程
- MySQL 8.0 运维便捷命令
- 如何清除文件中的数据?
- 历史长河中的茶马古道,正在迅速消失的茶马古道马帮
- 玉雕|玉雕中的素活儿,最是令人心动