近日,微软发布了 Visual Studio 2019 的发布日期,2019 年 4 月 2 日 Visual Studio 2019 将正式和大家见面,同时微软还将提供发布现场实时直播。

除了 Visual Studio 2019 自身之外,VS 2019 的发布还牵动着很多 C# 开发者的心。虽然一个月之前发布的 Visual Studio 2019 Preview 版本已经可以试用 C# 的某些新功能,但还有一些是不可试用的。

下面我们就来看一下微软官方对 C#8.0 重要功能的概述。

可空的引用类型

此功能的目的是防止无处不在的空引用异常,空引用异常已经困扰面向对象编程半个世纪了。该功能将阻止开放者将 null 值放入到普通的引用类型中,例如 String 类型不可为空。但它不是强制性的 error,而是比较温和的 warning。

这些异常现在已经过了半个世纪的面向对象编程。
它阻止你 null 进入普通的引用类型,例如 string- 它使这些类型不可为空!它是温和的,有警告,而不是错误。但是在现有代码上会出现新警告,因此您必须选择使用该功能(您可以在项目,文件甚至源代码级别执行此功能)。
string s = null; // Warning: Assignment of null to non-nullable reference type
如果你想要使用 null 怎么?可以使用空的引用类型,例如 string?:
string? s = null; // Ok
当你使用了可空引用时,需要先检查一下其是否为 null,编译器会分析代码流,以查看 null 值是否可以将其用于您使用它的位置:


void M(string? s)

{

Console.WriteLine(s.Length); // Warning: Possible null reference exception

if (s != null)

{

Console.WriteLine(s.Length); // Ok: You won't get here if s is null

}

}

C# 允许表达可空的意图,但是在不遵守规则时会发出警告。

异步流

C#5.0 的 async / await 功能允许在简单的代码中使用(并生成)异步结果,而无需回调:


async Task<int> GetBigResultAsync()

{

var result = await GetResultAsync();

if (result > 20) return result;

else return -1;

}

下面我们来介绍一下大家期待已久的 IAsyncEnumerable, 异步版本的 IEnumerable。该语言允许 await foreach 使用元素,并使用 yield return 生成元素。


async IAsyncEnumerable<int> GetBigResultsAsync()

{

await foreach (var result in GetResultsAsync())

{

if (result > 20) yield return result;

}

}

范围和索引

我们正在添加一个可用于索引的 Index 类型。你可以使用 int 从头创建,也可以使用 ^ 从末尾开始计算前缀运算符:
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 类型,它由两个 Indexes 组成,一个用于开始,一个用于结束,并且可以用 x…y 范围表达式编写。
可以使用 a 进行索引 Range 以生成切片:
var slice = a[i1…i2]; // { 3, 4, 5 }

接口成员的默认实现

今天,大家对于界面都有这样一个需求:在不破坏现有状态的情况下添加一个成员。

在 C#8.0 中,我们会为接口成员提供一个主体。如果有人没有实现该成员(或者是在编写代码时还没有实现),会获得默认实现。


interface ILogger

{

void Log(LogLevel level, string message);

void Log(Exception ex) => Log(LogLevel.Error, ex.ToString()); // New overload

}


class ConsoleLogger : ILogger

{

public void Log(LogLevel level, string message) { ... }

// Log(Exception) gets default implementation

}


在 ConsoleLogger 类不需要实现 ILogger 的 Log(Exception) 重载,因为它已经默认实现了。现在只要给当前实现者提供了默认实现,就可以向现有公共接口添加新成员。

递归模式

我们允许 pattern 中包含其他 pattern:


IEnumerable<string> GetEnrollees()

{

foreach (var p in People)

{

if (p is Student { Graduated: false, Name: string name }) yield return name;

}

}

pattern Student { Graduated: false, Name: string name }主要检查 Person 是 a Student,然后将常量 pattern false 应用于其 Graduated 属性以查看它们是否仍然已注册,并将 pattern string name 应用于其 Name 属性以获取其名称(如果为非 null)。因此,如果 p 是一个 Student,尚未毕业并且姓名非空,那么我们就可以 yield return 这个名字。

Switch 表达式

带有 pattern 的 switch 语句在 C#7.0 中已经非常强大了,但是编写起来却很麻烦,而 Switch 表达式却是一个解决这种问题的、“轻量级”的版本。


var area = figure switch

{

Line _      => 0,

Rectangle r => r.Width * r.Height,

Circle c    => Math.PI * c.Radius * c.Radius,

_           => throw new UnknownFigureException(figure)

};

目标类型的新表达式

在许多情况下,往往创建新对象时,类型已经从上下文中给出。在这些情况下,我们会让你省略类型:
Point[] ps = { new (1, 4), new (3,-2), new (9, 5) }; // all Points

C# 大版本关键更新回顾

C#1.0(Visual Studio .NET)

  • Classes

  • Structs

  • Interfaces

  • Events

  • Properties

  • Delegates

  • Expressions

  • Statements

  • Attributes

  • Literal

C#2(VS 2005)

  • Generics

  • Partial types

  • Anonymous methods

  • Iterators

  • Nullable types

  • Getter/setter separate accessibility

  • Method group conversions (delegates)

  • Static classes

  • Delegate inferenc

C#3(VS 2008)

  • Implicitly typed local variables

  • Object and collection initializers

  • Auto-Implemented properties

  • Anonymous types

  • Extension methods

  • Query expressions

  • Lambda expression

  • Expression trees

  • Partial methods

C#4(VS 2010)

  • Dynamic binding

  • Named and optional arguments

  • Co- and Contra-variance for generic delegates and interfaces

  • Embedded interop types (“NoPIA”

C#5(VS 2012)

  • Asynchronous methods

  • Caller info attributes

C#6(VS 2015)

  • Draft Specification online

  • Compiler-as-a-service (Roslyn)

  • Import of static type members into namespace

  • Exception filters

  • Await in catch/finally blocks

  • Auto property initializers

  • Default values for getter-only properties

  • Expression-bodied members

  • Null propagator (null-conditional operator, succinct null checking)

  • String interpolation

  • nameof operator

  • Dictionary initializer

C#7.0(Visual Studio 2017)

  • Out variables

  • Pattern matching

  • Tuples

  • Deconstruction

  • Discards

  • Local Functions

  • Binary Literals

  • Digit Separators

  • Ref returns and locals

  • Generalized async return types

  • More expression-bodied members

  • Throw expressions

平台依赖

大多数的 C# 8.0 功能都可以在任何版本的.NET 上运行,但也有一些功能是有平台依赖性的,例如异步流、范围和索引都依赖 .NET Standard 2.1 一部分的新框架类型。其中,.NET Standard 2.1、.NET Core 3.0 以及 Xamarin,Unity 和 Mono 都将实现 .NET Standard 2.1,而.NET Framework 4.8 不会,所以如果你使用的是 .NET Framework 4.8,那么 C# 8.0 的部分功能可能不能使用。

另外,接口成员的默认实现也依赖新的运行时增强功能,所以此功能也不适用于 .NET Framework 4.8 和旧版本的 .NET。

原文地址:https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/


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

VS 2019 要来了,是时候了解一下 C# 8.0 新功能相关推荐

  1. VS 2019要来了,是时候了解一下C# 8.0新功能

    近日,微软发布了Visual Studio 2019 的发布日期,2019年4月2日Visual Studio 2019 将正式和大家见面,同时微软还将提供发布现场实时直播. 除了Visual Stu ...

  2. vs2019功能介绍_MFC界面库BCGControlBar v30.0新功能详解:支持VS 2019

    亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.0正式发布!新版本添加了对Visual St ...

  3. 支付宝解释 2019 年账单总额较高;腾讯 QQ 回应新功能可显示对方实时电量;Python 2.7 结束支持 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

  4. MFC界面库BCGControlBar v30.0新功能详解:支持VS 2019

    亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.0正式发布!新版本添加了对Visual St ...

  5. Visual Studio 2019 首个预览版本抢先看,有啥新功能?

    微软在 Connect 2018 大会上发布Visual Studio 2019 第 1 个预览版本.该预览版本中展示了许多变更,从 IDE 的启动行为,到代码重构功能:从搜索功能的更多用法,到更好的 ...

  6. ZBRUSH 2019有什么新功能

    ZBrush 2019]继续走创意和生产力的道路,主要的新功能使艺术家能够更快地工作,特别是专注于更轻松地创建硬表面和机械形状.在工作期间,或在创作期间作为决赛,您将能够通过即时反馈产生令人惊叹的非现 ...

  7. PyCharm 2019.3发布,增加了哪些新功能呢?

    来源 | PyCharm官网 整理 | 猪哥 校正 | 豌豆花下猫 Python的IDE(Integrated Development Environment 集成开发环境)非常多,如:VS Code ...

  8. 2019ug最新版本是多少_UGNX将在2019年发布最新版本,也是最后一个版本,让人更意想不到的是它的这项新功能!...

    首先这个是不是叫NX1847目前还不确定,但是很多信息流传就是叫NX1847了,1847是西门子成立年份(1847年),并且好像已经邀请12个用户进行内测了.直接用这个年份来命名看来还真打算是NX最后 ...

  9. Exchange Server 2019新功能预览-揭秘被削减的功能

    前几篇和大家介绍了Exchange Server 2019的一些新功能,分别从安全.性能以及用户体验方面给大家做了介绍,有兴趣的朋友可以看一下. Exchange Server 2019新功能预览-安 ...

最新文章

  1. F#探险之旅(三):命令式编程(上)
  2. [SpringBoot]全局异常处理
  3. 如何处理OData错误消息Property XX at offset XX is invalid
  4. Linux命令之 mke2fs -- 格式化分区(为分区写入文件系统)
  5. 干货:产品经理怎么做才能在需求评审中少挨打?
  6. (笔记)网络技术学习交流会
  7. python写错了怎么撤回_python新手常见错误汇总
  8. 假如给Go语言加上注解,程序会变怎样?
  9. Ideal配置Struts项目提示Cannot resolve symbol 'xx.jsp',以及没有找到Namespace为/的指定Action的解决
  10. 怎样设置计算机默认字体及语言,电脑win10系统怎么将paint 3D的语言设置为中文...
  11. CentOS 7 service systemnctl
  12. 【BP数据预测】基于matlab蝙蝠算法优化BP神经网络数据预测【含Matlab源码 1379期】
  13. python相关系数显著性检验_Python+pandas计算数据相关系数的实例
  14. 用英语说计算机的优点1000,我的英语老师作文1000字
  15. Flutter 环境配置
  16. 安装caffe中间遇到的一些问题
  17. Linux配置sendmail实现PHP发送邮件
  18. ospfdr选举规则_OSPF:DR、BDR选举算法
  19. Operation was explicitly assigned to /device:GPU:0 but available devices are [ /job:localhost/repli
  20. 常见的对称式加密与非对称式加密算法

热门文章

  1. linux下tomcat开启远程调试
  2. List 分页加载数据控制机制
  3. Android SQLite (一) 数据库简介
  4. 能源项目xml文件 -- app-context.xml
  5. The import com.sun.tools cannot be resolved
  6. Android添加单元测试的方法与步骤
  7. aswing学习笔记3-在JPanel中,如何将.png格式的图片设置为背景?
  8. 提的最多的数据库“索引”,先来简单了解一下
  9. NET问答: 如何在 dynamic 集合上使用 Linq ?
  10. EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性