写点什么

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

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

关注

评论

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

数仓架构告别「补丁」时代!全新批流一体 Domino 架构终结“批流缝合”

YMatrix 超融合数据库

数据仓库 数据架构 流式数仓 超融合数据库 YMatrix

APISIX 可观测性最佳实践

观测云

APISIX

摊牌了!一文教会你轻松上手豆包MarsCode 编程助手!

火山引擎开发者社区

从 Copilot 到垂直工具:AI 编程的 "专精特新" 进化论

飞算JavaAI开发助手

YashanDB故障状态

YashanDB

数据库 yashandb

Netty源码—Pipeline和Handler(二)

不在线第一只蜗牛

Netty

实战案例|利用MarsCode内置的DeepSeek服务,单元测试耗时缩短70%!

火山引擎开发者社区

运维的价值为何经常被挑战?哪些工作更有价值?

巴辉特

运维 SRE

AI 大模型+智能客服:自动识别客户意图,实现高效沟通

阿里巴巴云原生

阿里云 云原生 函数计算

YashanDB伪列

YashanDB

数据库 yashandb

运维人的AI外挂来了!WeOpsV4.20&V5.20深度集成三大模型实现知识沉淀

嘉为蓝鲸

自动化运维 #WeOps

中物院超级计算与数字智能2025年大会:嘉为蓝鲸揭秘数智化运维转型关键突破点

嘉为蓝鲸

智能运维 数智化

ITSM运营双引擎:科学度量指标体系×LLM智能分析实战

嘉为蓝鲸

运维 AIOPS ITSM

火山引擎云上实战: DeepSeek R1 大模型(全尺寸)

火山引擎开发者社区

文献解读-SARS-CoV-2 variant Delta rapidly displaced variant Alpha in the United States and led to higher viral loads

INSVAST

生信服务 delta 变异检测 全基因组测序 基因分析

从加班到准点走:程序员用飞算 JavaAI 实现需求交付效率翻倍

飞算JavaAI开发助手

YashanDB双引号

YashanDB

数据库 yashandb

和鲸科技执行总裁殷自强受邀主讲华中附属同济医院大模型应用通识首期课程

ModelWhale

人工智能 大数据 医疗

🔥 新手也能懂!Shopee商品详情API接口全攻略

Noah

什么是权威解析服务器?权威解析服务器有什么用?(国科云)

国科云

YashanDB标识符

YashanDB

数据库 yashandb

嘉为蓝鲸自动化运维中心V2.6:规范运维范式,保障数字化转型成果

嘉为蓝鲸

AIOPS 自动化运维

Bypass Paywalls Clean 被封禁背后的新闻业困局

TechubNews

区块链 新闻 web3

从零到一:如何用 AI 工具一天内完成 Java 项目搭建?

飞算JavaAI开发助手

YashanDB字面量

YashanDB

链游冷启动核弹:DeFi清算收益+社交裂变,7天零成本获取10万真实玩家

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

黑龙江省多家政务服务移动端及政企内部办公应用适配鸿蒙,加速智慧政务升级

最新动态

技术赋能与创新实践:基于低代码平台的高性能应用开发

JeeLowCode低代码平台

低代码 低代码开发 低代码平台 低代码, 低代码选择

Java 开发者必备:2025 年 AI 工具推荐

飞算JavaAI开发助手

为什么大厂团队禁用代码片段工具?完整生成工具的 4 大不可替代性

飞算JavaAI开发助手

三星Neo QLED再次进化:高端电视还能怎么玩?

Alter

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