写点什么

C# 8.0 先睹为快

  • 2017-08-24
  • 本文字数:1416 字

    阅读完需:约 5 分钟

在 MSDN Channel 9 中,Mads Torgersen 先行通过视频展示了C# 8 的四个特性

可空的引用类型(Nullable Reference Types)

InfoQ 曾对可空的引用类型做了报道,该理念可概括地表述为,引用类型将不再默认可空。因此,开发人员必须使用定义可空值类型的同样语法“Type?”,显式地标记一个引用类型为可空。

如果将一个空值赋值给一个非可空的引用类型,那么将会给出一个编译器警告。与之相类似,从可空类型中读取也会给出编译器警告,除非显式地提前检查了被质疑的变量是否为空值。因此从理论上讲,开发人员需要做的唯一更改就是在代码的适当位置标上问号。

在InfoQ 的报道之后,该特性新加了一个语法。该语法针对开发人员明知一个可空变量 x并非实际为空值却无法证明给编译器的情况。在上述情况下,开发人员现在可以定义x!.Method(),消除编译器对于潜在空值引用异常的告警。

异步流(Async Streams),即 foreach async

异步流是 IEumerable 的异步等价类。正如 InfoQ 在前期所报道的,C#团队自 2015 以来就一直在努力实现异步流。在经历了很多争议后,其语法被定为:

复制代码
foreach await (string s in asyncStream)

开发人员将使用如下的函数签名定义一个异步迭代器:

复制代码
async IAsyncEnumerable<t> MethodName()</t>

就像使用一个正常的 IEnumerable 方法一样,开发人员可以使用“yield return”以懒方式(Lazy)构建对象流。

相比于源自响应式扩展(Reactive Extensions)的 IObservable,使用这一方法的优点在于让消费者控制流速,这被称为“Pull 模式”。与之相对,IObservable 是一种“Push 模式”,这意味着生产者可以使用高于消费者所能处理的流速让流涌向消费者。

缺省接口实现(Default Interface Implementations)

缺省接口实现在本质上是一种有限形式的多重继承。它允许抽象接口像抽象类一样,对方法进行完全的定义,只是抽象接口依然不能定义构造函数和字段。

需注意,开发人员可以通过使用 ConditionalWeakTable 在接口上模拟字段。

默认接口实现的主要好处是,开发人员可以在不破坏向后兼容的条件下,将一个新方法添加到一个已有的接口中。但是这并非是有保证的,因为默认接口只是在可以设计出适合的默认方法时才能工作。

这是一个颇具争议的特性。在此我们不会复述那些支持和反对的争论内容,对这些争论的总结,可以参见 InfoQ 先前对于默认接口实现的一篇文章。

扩展(Extension)

开发人员可以编写扩展方法,但是不能扩展属性,这是长期以来对 C#一直存在的一个抱怨。事实上,如果使用当前的模式,甚至是不能定义一个扩展属性或事件的。此外,在很多开发人员看来,在静态类中放置扩展方法是“很诡异的”。

新的设计中新给出了一种称为“扩展”(Extension)的顶层语言构件。例如,如果开发人员想要为自定义的 Customer 类创建一个扩展方法和属性,可编写如下代码:

复制代码
extension CustomerExt extends Customer {
// 定义方法和属性的代码。
}

就接口而言,是不能在扩展中定义实例字段的,但是可以使用 ConditionalWeakTable 实现模拟。定义静态字段也是允许的。

除了对属性、事件和操作符重载的扩展,C#团队甚至考虑允许扩展构造函数。扩展构造函数非常适用于工厂模式(Factory)和对象池场景。

扩展接口(Extension Interfaces)

C#团队还考虑了扩展接口,即在已有类中添加新接口的能力。但是扩展接口将不会成为 C# 8 中的特性,因为它需要更改底层的运行时。

如想更多地了解 C#的未来发展,请查看 C# Language Design Repo

查看英文原文: C# 8.0 Previewed

2017-08-24 19:004136
用户头像

发布了 227 篇内容, 共 71.4 次阅读, 收获喜欢 27 次。

关注

评论

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

一个简单的单体服务流量标记demo

zuozewei

Java 性能测试 全链路压测 12月日更

MySQL 中 blob 和 text 数据类型详解

Simon

MySQL

(转)前端开发之MySQL分区表中的性能BUG

@零度

MySQL 前端

JAVA 开发常用工具汇总

编程江湖

java编程

重装上阵——Graviton2提升Aurora性价比

亚马逊云科技 (Amazon Web Services)

Data

蓝格赛(中国)用TDengine落地聚合查询场景,效果如何?

TDengine

数据库 tdengine 后端

喜提双奖 | 旺链科技彰显综合硬实力!

旺链科技

区块链 产业区块链 供应链

盘点 2021|不忘初心,扬风起航

小鲍侃java

盘点2021

一文详解TDSQL PG版Oracle兼容性实践

腾讯云数据库

tdsql 国产数据库

孩子,你为什么要上学?

Tiger

28天写作

云图说|初识数据库和应用迁移UGO

华为云开发者联盟

数据库 华为云 UGO 异构迁移

web技术分享| 白板SDK的几种图形检测算法

anyRTC开发者

前端 音视频 白板 web技术分享 图形检测算法

利用极狐GitLab DevSecOps 功能检测 log4j 的多种方式

极狐GitLab

腾讯云原生数据库TDSQL-C斩获2021 PostgreSQL中国最佳数据库产品奖

科技热闻

盘点2021 | 技术十年-记录十年技术经历

高性能架构探索

技术人 工作经历 经历分享 盘点2021

轻松驾驭EB级千万QPS集群,TDSQL新敏态引擎元数据管控与集群调度的演进之路

腾讯云数据库

tdsql 国产数据库

如何将Amazon RDS与Amazon Aurora数据库迁移至Graviton2?

亚马逊云科技 (Amazon Web Services)

Data

解析Redis操作五大数据类型常用命令

华为云开发者联盟

数据库 redis string 数据类型 getset

鲲鹏HCIA认证之初识鲲鹏

桥哥技术之路

鲲鹏

又拿奖了!腾讯云原生数据库TDSQL-C斩获2021PostgreSQL中国最佳数据库产品奖

腾讯云数据库

tdsql 国产数据库

「山东城商行联盟」数据库准实时数据采集系统上线,DataPipeline助力城市商业银行加快数字化转型

DataPipeline数见科技

数据库 中间件 数据同步 数据融合 数据管理

​使用 Amazon Neptune 通过数据仓库构建知识图谱,借此补充商务智能体系

亚马逊云科技 (Amazon Web Services)

Data

Go编译原理系列2(词法分析&语法分析基础)

书旅

Go 后端 编译原理

发布你的开源软件到 Ubuntu PPA

hedzr

#Ubuntu Debian packaging ppa

java开发之SSM开发框架

@零度

Java ssm

内核干货不容错过,龙蜥内核的Load Averages剖析直播回顾上线了

OpenAnolis小助手

Linux Kenel 内核 龙蜥社区

跟着动画学Go数据结构之堆排序

宇宙之一粟

golang 数据结构 排序算法 Go 语言 12月日更

前沿干货!深度揭秘TDSQL新敏态引擎Online DDL技术原理

腾讯云数据库

tdsql 国产数据库

一文带你梳理Clang编译步骤及命令

华为云开发者联盟

编译 LLVM Clang编译 Clang 编译命令

DM 分库分表 DDL “悲观协调” 模式介绍丨TiDB 工具分享

PingCAP

Apache APISIX 社区双周报 | 功能亮点更新进行中

API7.ai 技术团队

云原生 后端 开源社区 api 网关 Apache APISIX

C# 8.0先睹为快_.NET_Jonathan Allen_InfoQ精选文章