C# 8.0先睹为快

2017 年 8 月 25 日 细说云计算 Jonathan Allen
作者|Jonathan Allen
译者|Rays

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

可空的引用类型  

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

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

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

异步流,即 foreach async  

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

foreach await (string s in asyncStream)

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

async IAsyncEnumerable MethodName()

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

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

缺省接口实现  

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

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

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

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

扩展  

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

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

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

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

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

扩展接口  

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


【普通程序员,如何转型 AI 方向?】AI 时代,很多程序员都纷纷想踏入人工智能领域。作为最流行的机器学习语言,Python 可以说是入门机器学习最有效率的一门武器。为了带大家华丽转型,StuQ 推出《普通程序员转向人工智能——3 个月掌握 Python 机器学习(60 课时大课)》。这套课程可以让你全面、系统地掌握机器学习的相关知识,并能胜任机器学习中级工程师及以上的工作。特别地,本课原价 6999 元,团购价 1999 元。

细说云计算  

「细说云计算」是 InfoQ 旗下关注云计算技术的垂直社群,投稿请发邮件到 editors@cn.infoq.com,注明“细说云计算投稿”即可。

登录查看更多
0

相关内容

C# 是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C# 由 C 语言和 C++ 派生而来,继承了其强大的性能,同时又以 .NET 框架类库作为基础,拥有类似 Visual Basic 的快速开发能力。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
专知会员服务
145+阅读 · 2020年6月15日
【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
27+阅读 · 2020年5月25日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
微信小程序支持webP的WebAssembly方案
前端之巅
19+阅读 · 2019年8月14日
已删除
AI掘金志
7+阅读 · 2019年7月8日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
设计和实现一款轻量级的爬虫框架
架构文摘
13+阅读 · 2018年1月17日
Heterogeneous Deep Graph Infomax
Arxiv
12+阅读 · 2019年11月19日
Arxiv
3+阅读 · 2018年9月12日
Few Shot Learning with Simplex
Arxiv
5+阅读 · 2018年7月27日
Arxiv
7+阅读 · 2018年3月19日
Arxiv
7+阅读 · 2018年1月30日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
专知会员服务
145+阅读 · 2020年6月15日
【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
27+阅读 · 2020年5月25日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
微信小程序支持webP的WebAssembly方案
前端之巅
19+阅读 · 2019年8月14日
已删除
AI掘金志
7+阅读 · 2019年7月8日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
设计和实现一款轻量级的爬虫框架
架构文摘
13+阅读 · 2018年1月17日
相关论文
Top
微信扫码咨询专知VIP会员