写点什么

C# 8 小特性

2018 年 9 月 25 日

对于 C# 8,有吸引了大多数注意力的重大特性,如默认接口方法和可空引用,也有许多小特性被考虑在内。本文将介绍几例可能加入 C#未来版本的小特性。

新的赋值运算符:&&= 和||=

从第一个版本开始,C#就支持把等号和另外一种运算符合在一起的语法。这几乎包括除短路布尔运算符 && 和||之外的所有的二元操作符(如 +、-、& 等)。“赋值运算符&&= 和||= ”提案是对这个列表的补充。

逐字内插字符串

逐字字符串以@“开头。内插字符串使用$”。但是,如果你想要一个既逐字又内插的字符串呢?是用@$“还是$@”?目前,其中一个有效,另一个会报编译器错误,但是,人们通常很难记住哪个是哪个。

在一个名为“逐字插入字符串”的中肯提案中,该语法将得到扩展,接受@$"。对它的解释将和逐字插入字符串($@")完全相同,因此,你再也不用担心弄反了。

关于这项修改,存在一些小争议,因为有人认为这没有必要或者会导致不一致。

允许using 语句结构匹配IDisposable

接口与C#编译器之间存在着奇怪的关系。经常,你不必为了使用一个语言特性而真正实现一个具体的抽象接口;你只需在类似抽象接口的类上创建一个公开的API。

典型的例子是“foreach”和IEnumerable。如果类有一个方法GetEnumerator,返回一个包含Current 属性和MoveNext 方法的对象,那么你就可以使用foreach。实际的返回类型不重要,这使得 List这样的类似可以实现更快速的枚举器。这通常称为“结构匹配(structural matching)”。

在这个提案中, using 语句也将支持结构匹配。这乍看之下没什么用,因为你不会希望看到一个可释放类没有实现 IDisposable。不过,有一种名为 ref struct 的新类型。它们不能实现接口,因此,如果没有这项提案,你在使用它们时就无法使用 using 语句。

和 foreach 与 using 共用的扩展方法

这个提案是前述提案的补充,是为了能够把 GetEnumerator 或 Dispose 作为扩展方法添加,并且可以分别和“foreach”或“using”共用。再次,我们谈论的这项特性仅用于非常特殊的情况。例如,你可以从第三方库(这可能是调用 Marshal.ReleaseComObject 的好地方)向一个 COM 对象添加一个 Dispose 扩展方法。

这还不是一个正式的提案,可能会合并到前面提到的“using”语句修改中。

“using”语句隐式作用域

目前,“using”语句后面只能是一个显式作用域(即一对花括号)或者另一个“using”语句。如果这个提案通过,你就可以编写下面这样的代码:

复制代码
using var a = new MyDisposable();
using var b = new MyDisposable();
using var c = new MyDisposable();

上述每个变量都会在当前作用域结束时以相反的顺序自动释放。从功能上说,这和下面的代码等价,但更简洁,也不会引入新作用域。

复制代码
using (var a = new MyDisposable())
using (var b = new MyDisposable())
using (var c = new MyDisposable())
{
// 一些代码
}

当需要多个可释放对象而又不同时创建时,这项修改会特别有用。你甚至可以在表达式中间创建可释放对象,而且可以确信,它将在当前作用域结束时释放。
var results = myExcelReader.ReadResults(using new MyExcelSheet(excelFilePath));对于这项提案,其中一个批评是,它与某些语句如“goto”不兼容。

查看英文原文: C# 8 Small Features

2018 年 9 月 25 日 05:161626
用户头像

发布了 1008 篇内容, 共 313.6 次阅读, 收获喜欢 282 次。

关注

评论

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

如何管理过程质量?新手管理者的陷阱

一笑

管理 管理者 28天写作 质量保证

十个手指头弹钢琴、高水准欣赏探讨优雅益智的古典音乐技术 数学不好很难进行

Geek_459987

交易所软件系统开发|交易所APP开发

开發I852946OIIO

系统开发

使用 Docker 部署 RabbitMQ 没有日志?添加这两条配置,轻松搞定

AlwaysBeta

Docker RabbitMQ 消息队列 消息中间件

读任正非“星光不问赶路人”有感

JiangX

华为 战略 28天写作 任正非

数字资产钱包系统软件开发|数字资产钱包APP开发

开發I852946OIIO

系统开发

智慧社区建设解决方案,平安社区综合应用平台

135深圳3055源中瑞8032

无代码、Excel与Airtable

lidaobing

低代码 Excel 无代码开发 28天写作 Airtable

为什么很多事情说起来容易做起来难

Justin

学习 心理学 成长 心态 28天写作

币币交易系统APP开发|币币交易软件开发

开發I852946OIIO

系统开发

什么是上瘾?

石云升

28天写作 上瘾

区块链电子证照共享平台建设方案,智慧政务系统建设

135深圳3055源中瑞8032

技术招聘常被吐槽,企业应该考虑好这一点

李忠良

28天写作

大数据知识专栏 - Hadoop的资源管理 Yarn介绍

小马哥

大数据 hadoop YARN 大数据技术 七日更

我是如何学习编程的?

熊斌

学习方法 个人成长 编程之路 28天写作

一个系统小BUG修复投产居然花了3个小时来处理(下)

罗小龙

28天写作 投产事故 解决思路

理解领域驱动设计

云流

编程 领域驱动设计

项目管理系列(8)-从0到1搭建PMO(一)

Ian哥

28天写作

【CSS】红砖背景

学习委员

css3 前端 html/css CSS小技巧 28天写作

GoF23 中的对象关系模式!

Arvin

方法论 设计模式 构建模型

历史上的今天

Tango

七日更

你有多久没去看海了呢「幻想短篇 15/28」

道伟

28天写作

区块链量化交易怎么做?

v16629866266

区块链数字货币交易所系统开发|区块链数字货币交易所软件APP开发

开發I852946OIIO

系统开发

开放式API安全防护的七大原则

架构精进之路

API 七日更 28天写作

阿里,字节,腾讯,面试题都涵盖了,这一份Java面试文档也太强了

云流

数据库 程序员 java面试

提问也是一门学问

xcbeyond

程序人生 方法论 技巧 28天写作

Soul 源码阅读 03|WebSocket 同步数据分析

哼干嘛

Java 源码分析 Soul网关

关于“为更新而更新”的一种新的理解

Nydia

智慧公安派出所系统开发方案,警务大数据分析平台建设

WX13823153201

智慧公安派出所系统开发

动听百年:音乐播放器发展沉浮史

艾小仙

互联网

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

C# 8小特性-InfoQ