C# 8.0的三个令人兴奋的新特性
本文翻译自:https://dzone.com/articles/3-new-c-8-features-we-are-excited-about
转载请注明出自:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高度耦合,这也有助于开发者更好的学习掌握 C#,并将其与 Visual Studio 以及 .NET 的使用结合起来。
加快 C# 版本的发布速度
在被称为“新微软”的推动下,微软创新的步伐也加快了。为了做到加快步伐,微软开发部门将一些过去集成在一起的技术现在都分离了出来。
Visual Studio、.NET Framework、.NET 运行时、编译器和编译运行时的运行语言都被拆分成自己的包和版本,这意味着以上每一个都可以按照自己的节奏发布了。现在,我们已经看到了这种模式的成功。.NET Core 2.0 的工作已经完成了,并从 Visual Studio 发布出来,同时也增加了对 Linux 的支持。几乎与 .NET Core 2 发布的同时,C# 7.1 版本也发布了。
C# 7.1 是一个重要的发布版本,虽然新功能不多,但它却是 C# 第7个大版本的开始。C# 7.2 版本的工作已经展开了,同时也在计划着 C# 7.3 版本。尽管 C# 8.0 版本还有点远,但是微软技术人员已经对 C# 8.0 版本的特性有了一些想法。
语言设计的讨论是公开的,围绕 C# 8.0 版本新特性的问题部分也进行了广泛的讨论。检查每个发行版本的里程碑,同时也为未来的 C# 路线图做好评估。
下面正式开始介绍 C# 8.0 版本中值得关注的三个新特性。
非空和可空的引用类型
C# 有两大变量类型:基本类型和引用类型。原先的类型是 int、char 和 double。这些类型都不能接受 null 值。在不分配新值的情况下,创建一个新的 int 值,会导致 int 值为 0 而不是 null。C# 2.0 介绍了带有“?”符号的变量原语的可空版本。因此,int?是 int 的一个版本,它可以接受空值。
另一方面,引用类型(如字符串这样的对象)始终能够接受 null 值,并将 null 作为默认值。这也带了来一个缺点,就是可能导致应用程序中带入空引用。
在 C# 8.0 中,将引用类型设为非空,成为了一个可选的特性。
为 C# 引入这样的特性是很困难的,因为这为原本已经运行很好的代码,引入了潜在的编译错误。因此需要做的是,创建此功能的方法,而不是为开发人员带来无法估量的工作量。
根据设计方案,C# 团队决定采取一个允许开发者可以选择可空引用类型的方法。这将是一个工程级别的设定,以便启用对可空引用的验证。一旦启用,可接受 null 值的对象就需要使用?运算符进行声明。
如下代码:
String s = null;
Console.Write(s);
这将引起警告,因为字符串不能接受空值。因此需要以下代码:
String? s = null;
Console.Write(s);
然而,上面代码也会在Console抛出一个警告,写的是不希望收到一个空字符串。事实上,原始代码可能有错误,所以级联警告可以帮助我们避免运行时错误。这是最有可能提高代码质量的语言变化。
新的轻量级类:Records
C# 8.0 的一个很棒的新特性,是有一种新方式来创建一个被称为 records 的类。这个类本质上是一个非常轻量级的类,是一个字段集合,能够帮助快速创建 POCO 类型的对象,同时也可以解决比较对象是否相等时的关键问题。
例如,为银行帐户创建 record 类型:
class BankAccount(Guid Id, string Name, decimal Balance)
这是一种创建简单类的很好的方法。
用 records 解决对象相等问题
在 C# 编程中,一个最难掌握的内容就是,将==运算符用于引用类型和原语之间的区别。
为了举例说明,我们使用==对比两个整数:
int I = ;
int j = ;
i == j //yields true
原语的值是相等的。但是,对于引用类型,却不相等。
Object I = new Object();
Object j = new Object();
i == j //yields false
这是因为 C# 的引用类型比较会考虑引用相等,也就是说,只有当两个对象是同一个对象才相等。records 类型提供了结构上的相等,等同于相等运算符。创建新 record 的语法非常简洁,因为生成的对象是简单的数据传输对象。
Records 是一个轻量级对象,使用起来非常方便。虽然 Records 不是语言的一个突破性的变化,但也是一个渐进的改进,值得欢迎。
默认接口实现
版本控制接口可能会令人懊恼, 因为它要求接口上的新方法来实现接口上的所有对象。随着新方法添加到了接口中,实现它们的任务就落在了实现接口的各个类中。因为各个实现不必须共有同一个父类,添加到接口的方法就可以在各自的类中实现。
默认接口实现允许在接口中指定一个实现,只要它是接口上现有方法的函数实现的。下面再以银行帐户为例:
public interface IBankAccountManager{
void PerformTransaction(decimal amount, string reason);
}
现在为了便于使用,我们想在银行账户上提供明确的借方和信誉功能。通常我们会为接口添加这些功能并在所有的类中实现它们。
public interface IBankAccountManager{
void PerformTransaction(decimal amount, string reason);
void PerformDebit(decimal amount, string reason){
PerformTransaction(- * amount, $”Debit: {reason}”);
}
void PerformCredit(decimal amount, string reason){
PerformTransaction(amount, $”Credit: {reason}”);
}
}
默认接口实现提供了一种强大的新方法来扩展实现接口的类,而无需重复代码。只需遵从默认实现,许多接口的类的实现就可以得到大大简化。
其它的 C# 8.0 新特性
正是因为这些新特性,才让我们毫不怀疑这就是 C# 8.0。以下是其它一些 C# 8.0 新特性:
- 提升扩展支持 – 这种提升不仅仅可以用于扩展方法,它还提供了对属性、静态方法和更多方面的支持。
- 异步数据流 – 能够拥有支持异步操作的枚举值。包括新的 iasyncenumerable <T> 和 iasyncenumerator <T> 接口。
- Async Disposable – iasyncdisposable 允许对象有一个异步的处理方法。
结论
过去几年中,.NET 的创新速度确实加快了。虽然 C# 8.0 目前还没有实现,但是它比起 C# 7.0,将带来很多有帮助的提升,让我们一起期待 C# 8.0 的早日到来。
相关阅读:
C# 8.0的三个令人兴奋的新特性的更多相关文章
- atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性 1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...
- ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录
放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...
- Python 3.8.0 正式版发布,新特性初体验 全面介绍
Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...
- 【译】.NET 5. 0 中 Windows Form 的新特性
自从 Windows Form 在 2018 年底开源并移植到 .NET Core 以来,团队和我们的外部贡献者都在忙于修复旧的漏洞和添加新功能.在这篇文章中,我们将讨论 .NET 5.0 中 Win ...
- Atitit opencv3.0 3.1 3.2 新特性attilax总结
Atitit opencv3.0 3.1 3.2 新特性attilax总结 1. 3.0OpenCV 3 的改动在哪?1 1.1. 模块构成该看哪些模块?2 2. 3.1新特性 2015-12-21 ...
- Python 3.8.0 正式版发布,新特性初体验
北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PEP 572: Assignment Expressi ...
- Elasticsearch 7.0 发布都有哪些新特性
了解about云知识星球 .pcb{margin-right:0} 问题导读 1.Elasticsearch&Kibana 7.哪些需要修改? 2.Elasticsearch7 有哪些新特性? ...
- [转]JDK1.0到12各版本新特性
原文链接 JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢.JDK Version 1.1 1 ...
- Android5.0中Material Design的新特性
最近项目中需要用到Material Design,整理了下面几个常用的控件,以便记忆. 一.Snackbar 1.作用:与Toast类似,但是可以点击监听: 2.使用: (1)Snackbar调用静态 ...
随机推荐
- Hibernate第十篇【Hibernate查询详解、分页查询】
前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式-.到目前为止,我们都是使用一些简单的主键查询阿-使用HQL查询所有的数据-.本博文主要讲解Hibernate的查询操 ...
- JSON的基本结构和数据交换原理
0.补充的写在前面的话 2017.03.29 补充内容 最近看到这篇博客的阅读量,想来应该是有部分网友来过想要了解JSON的基本概念,这篇博文写得可能不是那么好,所以现在再补充贴一位老师的文章,希望能 ...
- 框架应用:Spring framework (一) - IoC技术
IoC概念以及目标 IoC就是让原本你自己管理的对象交由容器来进行管理,其主要的目的是松耦合. IoC发展史 既然IoC的目标是为了松耦合,那它怎么做到的? 最后目标:降低对象之间的耦合度,IoC技术 ...
- [UIKit学习]03.关于UILable
代码创建UILabel UILabel *label = [[UILabel alloc] init]; label.text = @"单肩包"; label.frame = CG ...
- SSM框架—详细整合教程(Spring+SpringMVC+MyBatis)
很久没有新搭建过框架了,今天搭建一遍.以往都是在eclipse中搭建,今天换Idea吧,目前来说Idea用的还是很多的,但是用习惯了eclipse的朋友,可能会不太习惯 ok.....开始: 注意区分 ...
- Xcode 上传代码到GitHub
几乎所有iOS程序员都上过GitHub寻找开源类库,的确,GitHub上有大量优秀的开源类库供大家学习.但是如何在Xcode中上传代码至GitHub呢? (开始之前先安装git,具体方法这里讲的很清楚 ...
- 巧用Mono.Cecil反射加载类型和方法信息
最近在做服务的细粒度治理,统一管理所有服务的方法.参数.返回值信息.方便后续的各个模块之间的对接和协作. 目前系统中所有的服务,管理到接口契约粒度,即服务接口声明和服务接口实现.要做服务的细粒度治理: ...
- Robberies hdu 2955 01背包
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Suneast & Daxia (规律)
Suneast & Daxia Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u ...
- Ubuntu 定时任务中的环境变量设置
背景 1,定时任务命令 crontab -e 2,默认的环境变量 SHELL=/bin/sh PATH=/usr/bin:/bin PWD=/home/owl LANG=zh_CN.UTF- SHLV ...