写点什么

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:003465
用户头像

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

关注

评论

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

How to Add a Built-in Function to TiDB Using a Cursor in 20 Minutes

TiDB 社区干货传送门

TiDB 源码解读

电感生活So EZ 长安马自达MAZDA EZ-6全场景开放道路试驾

科技热闻

全球布局、极速集成:IMkit搭建全面、快捷、安全的聊天应用

ZEGO即构

人工智能 即时通讯 IM UIKits imkit

非凸科技钻石赞助第四届Rust China Conf 2024

非凸科技

TiDB在 G7 的实践和未来

TiDB 社区干货传送门

MySQL 扛不住了,来试试这款平替的“国产化改造”必入手的国产数据库吧!

TiDB 社区干货传送门

是什么让 TiDB 从一款中国受欢迎的数据库产品在短短几年内成为全球受欢迎的数据库产品?

TiDB 社区干货传送门

手工转测试开发轻松实现薪资 50%涨幅的逆袭之路

测吧(北京)科技有限公司

测试

2024 医疗 Datathon 又叕来啦~!“理-工-医-信”跨学科联合科研,以数据驱动医疗实践

ModelWhale

R 语言 datathon 医疗大数据

一文说清楚数据集成中的流处理与批处理的区别

RestCloud

Apache 数据处理 批处理 ETL 流处理

SQL 中 Drop、Delete 与 Truncate 的区别

Chat2DB

数据库 开源 AI sql

参与“2024,我想和 TDengine 谈谈”有奖征文活动,赢 AirPods

TDengine

数据库 tdengine 时序数据库

几张图带你了解TiDB架构演进

TiDB 社区干货传送门

版本升级

品牌未来式,增长进行时|2024凯度BrandZ中国品牌盛典回顾

财见

喜报 | 博睿数据荣获“绿色领导力董秘标杆之星”、“信息技术服务创新标杆之星”

博睿数据

NocoBase 与 NocoDB:开源无代码工具深度对比

NocoBase

开源 低代码 无代码开发 低代码开发 无代码

金蝶云·苍穹OEM版产品正式发布!AI时代共创软件产业新质生产力

金蝶云·苍穹

金蝶 生态伙伴 金蝶云苍穹

关于新版本 tidb dashboard API 调用说明

TiDB 社区干货传送门

集群管理 管理与运维 故障排查/诊断 新版本/特性解读 7.x 实践

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

TiDB 社区干货传送门

TiDB 底层架构

Serverless 安全新杀器:云安全中心护航容器安全

阿里巴巴云原生

阿里云 Serverless 云原生

《黑神话:悟空》真的带火云电脑了吗?

脑极体

AI

万界星空科技MES系统如何实现设备数据集成

万界星空科技

数据采集 mes 设备管理 万界星空科技

K1计划100%收购 MariaDB; TDSQL成为腾讯云核心战略产品; Oracle@AWS/Google/Azure发布

NineData

oracle 腾讯云 MariaDB tdsql K1

超级驾趣学院 长安马自达MAZDA EZ-6驾驭全场景出行

极客天地

mes系统在新材料行业中的应用价值

万界星空科技

mes 万界星空科技 生产管理MES系统 新材料mes 新材料行业

对比传统数据库,TiDB 强在哪?谈谈 TiDB 的适应场景和产品能力

TiDB 社区干货传送门

火山引擎VeDI核心产品DataTester再进化,A/B大模型应用评测功能上线

字节跳动数据平台

大数据 A/B 测试 对比实验 数字化增长

支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验

HarmonyOS SDK

HarmonyOS

人工智能 | ChatGPT 插件开发

测吧(北京)科技有限公司

测试

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