写点什么

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

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

关注

评论

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

首批成员!博云入选信通院“可信边缘计算推进计划”

BoCloud博云

云计算 开源 云原生

SAP ABAP Netweaver 服务器的标准登录方式讲解

汪子熙

web开发 web服务器 abap Netweaver 8月月更

NFT服务平台如何选择——搭建NFT平台技术

开源直播系统源码

数字藏品 数字藏品软件开发 数字藏品系统软件开发 数字藏品交易平台开发

阿里云杨红军:应用管理——云上资源DevOps最佳实践

阿里云弹性计算

阿里云 DevOps 运维 应用管理 云上资源管理

一文讲透Java核心技术之高可扩展利器SPI

冰河

Java 程序员 架构师 spi 核心技术

科技赋能会展!3DCAT助力广东旅博会元宇宙场景的首次搭建

3DCAT实时渲染

云计算 元宇宙

STM32入门开发 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)

DS小龙哥

8月月更

CCF国际AIOps挑战赛

云桌派

2篇论文入选KDD 2022!腾讯广告持续探索效果提升新思路

极客天地

2分钟一图看懂AntDB数据库产品

亚信AntDB数据库

AntDB 国产数据库 aisware antdb

易周金融分析 :支付科技着力服务产业数字化升级

易观分析

金融 产业数字化 分析 支付科技

零门槛掌握基于大模型技术的AIGC场景应用

文心大模型

如何利用CANN DVPP进行图片的等比例缩放?

华为云开发者联盟

人工智能 图像 昇腾AI

极狐 GitLab 冷知识:在 Gitlab CI Pipeline 中进行 Git Push 操作

郭旭东

极狐GitLab JIHULAB 101

HttpClient 在vivo内销浏览器的高并发实践优化

vivo互联网技术

Java 高并发 HttpClient

面试官:如何设计更好的分布式系统?

Java全栈架构师

程序员 架构 面试 分布式 后端

Android进阶(十五)socket通信实现聊天室应用开发总结

No Silver Bullet

android 8月月更 开发总结

令人上头的AI论文(上) | IDP Inspiration

Baihai IDP

2022 CCF国际AIOps挑战赛决赛暨AIOps研讨会成功举办

BizSeer必示科技

人工智能 AIOPS

Java 异步调用原理与实战

PPPHUANG

性能优化 线程池 Async Java core java nio

开源一夏 | 如何使用Java操作华为对象存储OBS删除一个目录?

wljslmz

Java 开源 对象存储 华为云 8月月更

RT-Thread记录(八、理解 RT-Thread 内存管理)

矜辰所致

内存管理 RT-Thread 8月月更

SAP ABAP 关键字语法图和 ABAP 代码自动生成工具 Code Composer

汪子熙

Java SAP abap commerce 8月月更

EasyNLP集成K-BERT算法,借助知识图谱实现更优Finetune

阿里云大数据AI技术

深度学习 阿里云 算法 开源技术 基础模型

即日起,ONES 团队版50人以下免费

万事ONES

virtio 1.2 来了!龙蜥社区携手业界打造新版虚拟化 IO 标准

OpenAnolis小助手

开源 虚拟化 龙蜥技术 virtio

3 分钟看 3 个 JS 小把戏

掘金安东尼

JavaScript 前端 8月月更

PyTorch 与 TensorFlow 怎么选?

博文视点Broadview

Go 事,如何成为一个Gopher ,并在7天找到 Go 语言相关工作,第1篇

梦想橡皮擦

Python 爬虫 8月月更

干货复盘 | 银行数智化转型十大趋势

易观分析

金融 银行 数智化转型

面试官偷偷告诉我:原来这样优化提升接口的性能

知识浅谈

API 优化 8月月更

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