[翻译] C# 8.0 新特性

原文: Building C# 8.0
[译注:原文主标题如此,但内容大部分为新特性介绍,所以意译标题为 "C# 8.0 新特性"]

C# 的下一个主要版本是 8.0。我们已经为它工作了很长一段时间,即使我们构建并发布了次要版本 C# 7.1, 7.2 和 7.3,我仍然对 8.0 将带来的新特性感到非常兴奋。

目前的计划是 C# 8.0 将与 .NET Core 3.0 同时发布。然而,随着我们正在开发的 Visual Studio 2019 的预览版,这些特性将开始活跃起来。当这些出来的时候,您就可以开始尝试它们,我们将提供有关各个特性的更多细节。这篇文章的目的是向您简述预期的内容,以及如何理解它们。

C# 8.0 新特性

下面是 C# 8.0 中最重要的新特性的概述。还有一些较小的改进正在进行中,这些改进将在未来几个月逐渐显现出来。

Nullable reference types 可空引用类型

此特性的目的是帮助处理无处不在的空引用异常,这种异常已经困扰了半个世纪的面向对象编程。

这个特性阻止您将 null 放入普通引用类型中(如字符串),从而使这些类型不可为 null!不过它是温和的提示警告,而不是错误。所以,它会让现有代码出现新的警告,因此您必须有选择的使用该功能 (您可以在项目、文件甚至行级别执行此操作)。

string s = null; // Warning: Assignment of null to non-nullable reference type

如果您确实想要 null 怎么办?可以使用一个可空引用类型,例如 string? 这样:

string? s = null; // Ok

当您尝试使用可空引用类型时,你首先需要检查是否为空。编译器会分析代码流,以查看 null 值是否可以将其用于当前位置:

void M(string? s){Console.WriteLine(s.Length); // Warning: Possible null reference exceptionif (s != null){Console.WriteLine(s.Length); // Ok: You won't get here if s is null}
}

这个特性的要点是,C# 允许您表达“可空的意图”,并且在您不遵守它时候发出警告。

Async streams 异步流

C# 5.0 的 async/await 特性使您可以用非常简单的代码消费(或生产)异步结果, 而无需回调:

async Task<int> GetBigResultAsync(){   
   var result = await GetResultAsync();  
   if (result > 20) return result; else return -1; }

如果您想要消费(或生产)连续的结果流(例如您可能从物联网设备或云服务获得),则没有那么有用。 异步流就是为此而存在的。

如果您想要消费(或生产)连续的结果流(例如您可能从物联网设备或云服务获得),则没有那么有用。 异步流就是为此而存在的。

我们现在介绍一下您所期望的 IAsyncEnumerable<T>,即 IEnumerable<T> 的异步版本。允许您 await foreach 以消费它们的元素,并 yield return 以生产元素。

640?wx_fmt=png

Ranges and indices 范围和索引

我们正在添加一个类型 Index,可用于索引。您可以创建一个整型来表示从头开始的索引,或者一个 ^ 前缀的从结尾表示的索引:

Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

我们还引入了一个 Range 类型,它由两个 Index 组成,一个用于开始,一个用于结束,并且可以用 x..y 这样的范围表达式来编写。然后,您可以使用 Range 进行索引来生成切片:

var slice = a[i1..i2]; // { 3, 4, 5 }

Default implementations of interface members 接口成员的默认实现

现在,一旦你发布了一个接口,游戏就结束了:你不能在不破坏它的所有现有实现的情况下向它添加成员。

在 C# 8.0 中,我们允许您为接口成员提供一个默认实现。因此,如果某人没有实现该成员(可能因为他们编写代码时还没有该成员),他们将只得到默认的实现。

640?wx_fmt=png

ConsoleLogger 类不必实现 ILogger 中 Log(Exception) 重载函数,因为它已经定义了默认实现。现在只要提供了一个默认实现,您就可以添加新的成员到已经存在的公开接口中了。

Recursive patterns 递归的模式匹配

在模式匹配中,现在允许模式中包含其他模式。

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 属性以查看它们是否已毕业,并将模式字符串 name 添加到其 Name 属性中,得到他们的名字(如果非空)。因此,如果 p 是 Student,没有毕业并且具有非空的名字,则返回该名字。

Switch expressions Switch 表达式

带有模式的 switch 语句在 C# 7.0 中非常强大,但编写起来很麻烦。switch 表达式是一个“轻量级”版本,其中所有情况都是表达式:

var area = figure switch {Line _      => 0,Rectangle r => r.Width * r.Height,Circle c    => c.Radius * 2.0 * Math.PI,_           => throw new UnknownFigureException(figure)
};

Target-typed new-expressions 已知目标类型的新表达式

在许多情况下,当您创建新对象时,类型已经可以从上下文中知道。在这些情况下,可以省略类型:

Point[] ps = { new (1, 4), new (3,-2), new (9, 5) }; // all Points

该功能的实现由社区成员提供,谢谢!

平台依赖性

大多数 C# 8.0 语言特性都可以在任何版本的 .NET 上运行。但是,其中一些具有平台依赖性。

Async streams, Index 和 Range 都依赖于 .NET Standard 2.1 的新类型。正如 Immo 在他的文章《公布.NET Standard 2.1》所说的那样,.NET Core 3.0 、Xamarin 、Unity 和 Mono 都将实现 .NET Standard 2.1,但 .NET Framework 4.8 不会。这意味着当您将 C# 8.0 指向到 .NET Framework 4.8 时,使用这些功能所需的类型将不可用。

与往常一样,C# 编译器对它所依赖的类型非常宽容。如果它能找到具有正确的名字和形态的类型,则很乐意将它们作为目标。

默认接口实现依赖于新的增强运行时,我们也不会在 .NET Runtime 4.8 中实现这些。因此,此特性不适用于 .NET Framework 4.8 和旧版本的 .NET。

十余年间,为了保持运行时的稳定,我们无法在其中实现新的语言特性。随着现代化运行时的并行性和开源性,我们觉得可以负责任地去重新开发它们,并在考虑到这一点时进行语言设计。 Scott 在其 .NET Core 3.0 和 .NET Framework 4.8 更新中解释说,.NET Framework 将来会看到较少的创新,而是关注稳定性和可靠性。考虑到这一点,我们认为,直接忽略某些语言特性会好一些。

想要了解更多?

C# 语言的设计过程是开源的,在这个repo中。如果您不经常跟进,可能会有点混乱和力不从心。语言设计的核心是语言设计会议,记录在 C# 语言设计日记。

大约一年前,我写了一篇介绍C#中的可空引用类型的文章。您仍然可以阅读它并得到一些信息。。

您还可以观看视频,例如 Microsoft Build 2018 大会上的 C# 未来,或者 .NET Conf 2018 大会上的即将到来的 C#,它展示了其中一些特性。

Kathleen 有一篇很好的帖子来阐述了 .Net Core 3.0 中的 Visual Basic 的计划。

当我们开始将这些功能作为 Visual Studio 2019 预览版的一部分发布时,我们还将发布有关各个功能的更多详细信息。

就个人而言,我迫不及待地要把它们交到你们所有人手中!

Happy hacking,

Mads Torgersen, Design Lead for C#

相关文章

  • C# 8小特性

  • C# 8中的Async Streams

  • 解决C# 7.2中的结构体性能问题

  • 解析Visual C# 7.2中的private protected访问修饰符

  • 基于Win10极简SonarQube C#代码质量分析

原文地址: https://www.cnblogs.com/Rwing/p/building-c-8-0.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯][2018年第九届真题]搭积木

[[蓝桥杯][2018年第九届真题]搭积木](https://www.dotcpp.com/oj/problem2292.html)题目&#xff1a; 小明对搭积木非常感兴趣。他的积木都是同样大小的正立方体。 在搭积木时&#xff0c;小明选取 m 块积木作为地基&#xff0c;将他们在桌子上一字排开&#xff0c;中间不留空…

NOI.AC#2007-light【根号分治】

正题 题目链接:http://noi.ac/problem/2007 题目大意 nnn个格子排成一排&#xff0c;每个格子有一个0/10/10/1和一个颜色。开始每个格子都是000&#xff0c;qqq次操作取反一个颜色的所有格子的0/10/10/1&#xff0c;然后询问111的格子构成的连通块数量。 1≤n,q≤1051\leq n,q…

【招聘(广州)】 招聘.NET程序员

招聘&#xff1a;.NET程序员工作地点&#xff1a;广州天河区CBD&#xff08;地铁3号线珠江新城站&#xff09;职位描述&#xff1a;网站平台、移动页面、APP、微信小程序、接口等开发&#xff1b;与UI/UX&#xff0c;设计师、产品经理偕同工作一起排查、定位、优化产品性能。任…

【模板】一维树状数组

ACM模板 目录聊聊前缀和什么是树状数组?树状数组相关操作局限性差分在树状数组中的应用区间更新、单点查询区间更新、区间查询树状数组应用聊聊前缀和 比如数组 int a[7]{1,2,3,4,5,6,7}如果需询问数组从第l个数到第r个数的和暴力做法时间复杂度为O(n)O(n)O(n) 不过我们可以…

牛客题霸 单链表的选择排序 C++题解/答案

牛客题霸 单链表的选择排序 C题解/答案 题目描述 给定一个无序单链表&#xff0c;实现单链表的选择排序(按升序排序)。 题解&#xff1a; 不可能手写排序&#xff0c;这辈子不可能手写排序。。 基础的链表操作&#xff0c;将链表内的数据存到vector内&#xff0c;然后用sor…

牛客练习赛71E-神奇的迷宫【点分治,NTT】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7745/E 题目大意 给出nnn个点的一棵树&#xff0c;每个点有一个选择权重aia_iai​&#xff08;有ai∑i1nai\frac{a_i}{\sum_{i1}^na_i}∑i1n​ai​ai​​的概率被选择&#xff09;。 然后有一个序列www。随机选择两次点&…

使用C#把Tensorflow训练的.pb文件用在生产环境

训练了很久的Tf模型&#xff0c;终于要到生产环境中去考验一番了。今天花费了一些时间去研究tf的模型如何在生产环境中去使用。大概整理了这些方法。继续使用分步骤保存了的ckpt文件这个貌似脱离不了tensorflow框架&#xff0c;而且生成的ckpt文件比较大&#xff0c;发布到生产…

OpenJudge1043 树上游戏(换根dp+细节处理)

树上游戏 给定一棵 nnn 个节点的树&#xff0c;点从 111 到 nnn 编号&#xff0c;点有点权&#xff0c;边有边权&#xff0c; Alice\text{Alice}Alice 和 Bob\text{Bob}Bob 两人在做游戏。 棋子以某一个点 sss 为起点&#xff0c;玩家移动该棋子&#xff0c;有以下两条规则&a…

牛客题霸 转圈打印矩阵 C++题解/答案

牛客题霸 转圈打印矩阵 C题解/答案 题目描述 给定一个整型矩阵matrix&#xff0c;请按照顺时针转圈的方式打印它。 示例1 输入 复制 [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] 返回值 复制 [1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10] 题解&#xff1a; 题意很明确…

【招聘(上海)】东方财富证券招聘.net开发

东方财富证券&#xff1a;东方财富网(深创&#xff1a;300059)旗牌照齐全证券公司&#xff0c;极具互联网基因的券商。.Net服务端开发工程师/.Net前端开发工程师[职位介绍]服务端&#xff1a;开户、交易及资讯系统的后端接口服务(Asp.Net WebApi)开发&#xff1b;服务端&#x…

2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出nnn个点的一棵树&#xff0c;mmm个时刻各有一个操作 标记一个点&#xff0c;每个点被标记后的每一个时刻会标记掉周围的点。删去所有点的标记询问一个点是否有标记 解题思路 考虑没有二操作怎么搞&…

codeforces773 D. Perishable Roads(思维+最短路)

D. Perishable Roads 题意简述&#xff1a; 一个 nnn 个点的完全图 以 iii 为根节点时 询问 能构造的树的 ∑d(x)\sum d(x)∑d(x) 最小是多少。 d(x)d(x)d(x)&#xff1a; xxx 到根节点边权值最小值 MOONPIE题解 首先有一个显而易见的错误贪心&#xff1a; 不妨假设以root\t…

牛客题霸 两数之和C++题解/答案

牛客题霸 两数之和 C题解/答案 题目描述 给出一个整数数组&#xff0c;请在数组中找出两个加起来等于目标值的数&#xff0c; 你给出的函数twoSum 需要返回这两个数字的下标&#xff08;index1&#xff0c;index2&#xff09;&#xff0c;需要满足 index1 小于index2.。注意&…

P3244-[HNOI2015]落忆枫音【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3244 题目大意 给出一个DAG\text{DAG}DAG&#xff0c;保证111可以到达所有点。然后再加入一条边&#xff08;之后不一定是DAG\text{DAG}DAG&#xff09;。 求有多少棵以111为根的外向生成树。 1≤n≤105,1≤m≤21051\leq n…

EF Core 实现多租户

SAAS 和多租户SaaS(软件及服务)区别于其他应用程序的主要特征就是能够使客户在使用应用程序时按照使用量付费。他们不需要为软件购买许可&#xff0c;也不需要安装、托管和管理它。这方面的操作全部由提供 SaaS 软件的组织负责。多租户是实现 SaaS 的关键因素, 它可以让多个企业…

P3246 [HNOI2016]序列(莫队+单调栈+ST表)

[HNOI2016]序列 Tea神题解 Kelin神题解 对于莫队算法最主要的是如何快速算出[l,r]→[l,r1][l,r]\to[l,r1][l,r]→[l,r1]对答案的贡献的变化。 当询问区间发生上述变化时[l,r]→[l,r1][l,r]\to [l,r1][l,r]→[l,r1]不难发现子区间增加这些&#xff1a;[l,r1],[l1,r1],…,[r,r1…

P6672-[清华集训2016]你的生命已如风中残烛【结论】

正题 题目链接:https://www.luogu.com.cn/problem/P6672 题目大意 长度为mmm的序列aaa&#xff0c;有nnn个数字不是000&#xff0c;其他m−nm-nm−n个是000。要求重排后有多少方案满足 ∀x,∑i1xai≥i\forall x,\sum_{i1}^xa_i\geq i∀x,i1∑x​ai​≥i 其中m∑i1naim\sum_{i…

牛客题霸 反转链表 C++题解/答案

题目描述 输入一个链表&#xff0c;反转链表后&#xff0c;输出新链表的表头。 示例1 输入 复制 {1,2,3} 返回值 复制 {3,2,1} 题解&#xff1a; 如果用偷懒的方法&#xff0c;可以用vector来存链表内容&#xff0c;然后来个翻转&#xff08;vector自带&#xff09;即可 但是…

【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

上篇文章【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置&#xff08;2&#xff09;我们介绍了2种网关配置信息更新的方法和扩展Mysql存储&#xff0c;本篇我们将介绍如何使用Redis来实现网关的所有缓存功能&#xff0c;用到的文档及源码将会在GitHub上开源&a…

P5934-[清华集训2012]最小生成树【最小割】

正题 题目链接:https://www.luogu.com.cn/problem/P5934 题目大意 给出nnn个点mmm条边的一张图&#xff0c;再加入一条边(u,v,L)(u,v,L)(u,v,L)求至少删掉多少条边可以使得这条边即在最小生成树上又在最大生成树上。 1≤n≤2104,1≤m≤21051\leq n\leq 2\times 10^4,1\leq m\…