硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

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

关注

评论

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

面试无忧:源码+实践,讲到MySQL调优的底层算法实现

996小迁

Java 架构 面试

《前端实战总结》之使用CSS3实现酷炫的3D旋转透视

徐小夕

css3 大前端 CSS小技巧

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

PostgreSQLChina

数据库 postgresql 开源

已拿腾讯后台开发岗offer,简单说下自己的面试经历和学习路线

程序员小灰

c++ 后台开发 架构师 TCP/IP Linux服务器开发

英特尔推动集成光电的发展,用于数据中心

E科讯

英特尔神经拟态生态系统发展和研究的最新进展

E科讯

IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

YourBatman

IDEA 新特性 2020.3

【技术分享】浅谈RTC及Agora RTC SDK集成介绍

Hanson

即使不会node.js,拖拽就可完成数据的可视化展示

华为云开发者联盟

node.js 数据 可视化

谁能阻止世纪互联星光?2020年第11期北京机房网络质量评测数据排行榜发布

博睿数据

《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

太白上仙

Java 程序员 面试 后端 多线程

关于binlog,这个参数能不能用?

Simon

MySQL Binlog

腾讯大牛整合Java+spring5系统学习架构,神乎其技

小Q

Java 学习 编程 面试 spring 5

ONES 收购 Tower,五源资本合伙人对话两位创始人

万事ONES

项目管理 团队协作 ONES Tower 收购

javascript开发后端程序的神器nodejs

程序那些事

Java 后端 nodejs koa 程序那些事

英特尔发布第二代Horse Ridge低温量子控制芯片

E科讯

国产电子表格Luckysheet后台也开源了!支持在线协作,一键docker私有部署

奇异石榴果

Java Excel SpreadJS 表格控件

性能压测

jorden wang

挑战赛 | 话题王者VS互动先锋(第一季)

InfoQ写作社区官方

话题讨论 热门活动

架构师训练营第 1 期 -week11

习习

微软最强 Python 自动化工具开源了!不用写一行代码!

星安果

Python 微软 自动化 自动化测试 playwright

一个真正0基础小白学习前端开发的心路历程

华为云开发者联盟

开发 开发小白 0基础

想了解任务型对话机器人,我们先从自然语言理解聊起

华为云开发者联盟

人工智能 机器人 自然语言

跨架构编程不再难,英特尔机器编程工具迎来重磅更新

E科讯

架构师训练营第 11 周课后练习

叶纪想

极客大学架构师训练营

加码线下,新荣耀“破题”场景经济

脑极体

Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)

linux大本营

c++ Linux 后台开发 架构师

给你一个亿的keys,Redis如何统计?

不才陈某

redis

1分钟解密:博睿大数据核心引擎Bonree Zeus六大优势

博睿数据

ONES 收购知名协作工具 Tower

万事ONES

团队协作 高效 研发管理工具 收购 资讯

训练营第七周作业

大脸猫

极客大学架构师训练营

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