写点什么

C# 8.0 正式发布:Visual Studio 2019 支持所有新功能

  • 2019-10-18
  • 本文字数:1832 字

    阅读完需:约 6 分钟

C# 8.0正式发布:Visual Studio 2019支持所有新功能

微软宣布 C# 8.0 作为 .NET Core 3.0 版本的一部分正式可用,该消息同步发布于.NET Conf 2019其开发博客中。新的语言功能包括可为空的引用类型、异步流、默认接口成员及新的代码模式。Visual Studio 2019 支持所有的新功能。


可为空引用类型是新版本中最重要的功能之一。它旨在通过使用特定语法规则来防止与空引用异常相关的场景,这个语法规则是:开发人员必须明确表示某个变量是否可以采用 null 值。在这种情况下,变量声明中的类型名必须附加“?”(类似可为空的值类型):


string? foo;
复制代码


如果该变量的类型名后面没有附加“?”,那么,它被视为一个不可为空的引用类型。在这种情况下,编译器将强制实行不可为空的规则:该变量必须被初始化为一个非空值,并且该变量永远不能被赋予空值。可以(在大多数情况下不推荐)用变量名后面附加空宽容操作符“!”来覆盖这个行为:


foo!.Length;
复制代码


还可以使用可为空上下文来控制是否给出可空警告,或者可为空的注解是否有影响。可以在项目级别或在带有 #nullable 和 #pragmawarning 预处理指令的源代码文件中指定可为空上下文。另外,一个类型可以具备的可为空行为是如下四种之一:无视(Oblivious),不可为空(nonnullable),可为空(nullable),未知(unknown)。不同的可为空类型会触发不同的编译行为。可为空引用类型的完整规范在这里


另一个重要功能是引入了异步流。该新功能的目的是引入对迭代器和异步方法的支持。此类方法可以用于需要消费或产生持续结果流(即来自物联网设备或云服务)的场景中。


异步流通过 IAsyncEnumerable  和 IAsyncEnumerator 接口实现,这些接口可以与 async/await 功能(最初在C# 5.0中引进)结合使用。返回异步流的方法必须用 async 修饰符声明,还必须使用某个新接口作为其返回类型。它还必须包含 yield return 语句来返回异步流中的后续元素。


下面的例子来自微软的官方文档。它实现了一个生成从 0 到 19 的序列的方法,生成每个数字之间的等待时间为 100 毫秒:


public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence(){    for (int i = 0; i < 20; i++)    {        await Task.Delay(100);        yield return i;    }}
复制代码


更多关于异步流的细节请参阅官方语言规范


默认接口成员功能允许开发人员给接口添加成员,并提供这些成员的实现(从而允许接口中的方法有具体实现)。目的是为 API 作者提供更多的灵活性,从而可以给现有接口添加方法而不会破坏与以前版本的兼容性。这个功能类似于 Java 的Default Methods


C# 8.0 还添加了两个新的代码模式:递归模式匹配和与 using 语句相关的模式。简而言之,递归模式允许模式包含其他模式,如下例所示(也来自于微软的官方文档):


IEnumerable<string> GetEnrollees(){    foreach (var p in People)    {        if (p is Student { Graduated: false, Name: string name }) yield return name;    }}
复制代码


模式 Student { Graduated: false, Name: string name }会检查 Person 是否是 Student,然后将常量模式 false 应用于其 Graduated 属性来看看其是否仍然已注册,并将模式 string name 应用于其 Name 属性来获得其名字(如果为非空)。因此,如果 p 是 Student,还没有毕业并拥有一个非空名字,那么,我们返回该名字。


using 语句相关的新模式允许它被添加到局部变量声明中。在这种情况下,局部变量 using 的寿命将延长到声明它的范围的末尾。如果有多个 using 局部变量,那么将按照声明它们的相反顺序进行处理:


{    using var foo1 = new FileStream("...");    using var foo2 = new FileStream("...");    ...        // Dispose foo2    // Dispose foo1}
复制代码


using 语句添加的另一个功能是 disposable 模式的概念,即可访问 Dispose 实例方法的类型。遵循这个模式的类型可以参与 using 语句,而无需实现 IDisposable:


class Bar{    public void Dispose() { ... }}using (var foo = new Bar()){    // statements}
复制代码


C# 8.0 中添加的其他功能包括 switch 语句语法的更改和目标类型的新表达式的添加,这允许在已经给定类型的上下文中创建新对象时,省略类型声明:


Vector2[] vectors = { new (1, 1), new (2, -1) };
复制代码


所有新功能的摘要都在这里,C#8.0 的完整规范建议在这里。另外,YouTube 上(这里这里)有 .NET Conf 2019 上展示新特性的技术演讲,该演讲强调了新的语言功能。所有Visual Studio 2019 版本中都支持 C# 8.0。


原文链接:


Microsoft Releases C# 8.0


2019-10-18 08:004237
用户头像

发布了 199 篇内容, 共 94.7 次阅读, 收获喜欢 295 次。

关注

评论

发布
暂无评论
发现更多内容

潮起风来,政企DICT “跃升”之乘风破浪篇

鲸品堂

DT IT 企业号 4 月 PK 榜 ct

博睿数据受邀出席GOPS 2023 深圳站:自适应AI支撑可观测性全面升级

博睿数据

可观测性 智能运维 博睿数据 Bonree ONE 自适应AI

Redis一主二从环境搭建

京茶吉鹿

nosql redis

JetCache 缓存开源组件设计精要

阿里技术

缓存 JetCache

这份Java面试八股文让329人成功进入大厂,堪称2023最强

Java你猿哥

Java 面试 面经 春招 Java八股文

IT架构师全栈成长路线,13张架构图一次说明白

Java你猿哥

Java 面试 架构师 面经 Spring全家桶

如何将微前端项目部署在同一台服务器同一个端口下

京东科技开发者

微前端 京东云 企业号 4 月 PK 榜

安全测试前置实践1-白盒&黑盒扫描

京东科技开发者

京东云 安全测试 企业号 4 月 PK 榜

AI 能否取代打工人?| 社区征文

阿发

三周年征文

“成本刺客”防不胜防,如何应用亚马逊云科技驾驭云成本

Lily

Spring 之依赖注入底层原理

Java你猿哥

spring ssm 架构师 Java工程师 spring ioc

浏览器缓存清理:Cookie for Mac6.9.0激活版

真大的脸盆

Mac Mac 软件 缓存清理 清理缓存 缓存处理工具

MySQL主从复制原理剖析与应用实践

vivo互联网技术

负载均衡 高可用 主从复制 数据备份 Binary Log

包装了三年工作经验的我,被同事发现居然连这些Maven的操作都不懂

Java你猿哥

maven ssm 架构师 Java工程师

展心展力 metaapp:基于 DeepRec 的稀疏模型训练实践

阿里云大数据AI技术

机器学习 算法 稀疏模型

测试1号位的自我修养

京东科技开发者

测试 京东云 企业号 4 月 PK 榜

前端自动化测试之葵花宝典

京东科技开发者

前端 企业号 4 月 PK 榜

为了减少延迟和卡顿,我对 MySQL 查询做了这些优化处理...

Java你猿哥

MySQL sql ssm MySQL优化 优化SQL

火了!阿里资深架构师总结的春招Java岗核心笔记,GitHub标星20k

Java你猿哥

Java ssm 面经 Java工程师 java核心知识

五面阿里巴巴拿offer后定级P6:分享Java面经及答案总结

Java你猿哥

Java 面试 面经 春招 Java八股文

技术同学如何做好向上管理

老张

职场新人 向上管理

MySQL主从复制原理剖析与应用实践

Java MySQL 数据库 主从复制

流程图哪个软件好用?10款好用的流程图软件推荐:boardmix、Visio、Miro…

彭宏豪95

效率工具 职场 工具 流程图 在线白板

阿里P8架构师3年心血终成的453页神级Java系统分析与架构设计文档

Java 架构设计 系统分析

设计模式-备忘录模式

Java你猿哥

Java 设计模式 ssm 架构师 备忘录模式

Redis缓存穿透/击穿/雪崩以及数据一致性的解决方案

Java你猿哥

redis ssm 架构师 Java工程师

MySQL自增ID用完了怎么办?4种解决方案!

Java你猿哥

Java MySQL sql 后端 ssm

线上问题排查异闻录

小小怪下士

Java 程序员 后端 堆内存管理

GitHub上线一天星标99.9K:阿里内部高逼格SpringCloud实战手册

Java 架构 微服务 Spring Cloud

华为运动健康服务Health Kit 6.10.0版本新增功能速览!

HarmonyOS SDK

HMS Core

一文了解MySQL中的多版本并发控制

京东科技开发者

MySQL 京东云 企业号 4 月 PK 榜

C# 8.0正式发布:Visual Studio 2019支持所有新功能_编程语言_Arthur Casals_InfoQ精选文章