C# 7.1、7.2特性追踪

2017 年 11 月 05 日

作为 Visual Studio 15.3 的一部分,微软发布了自.NET 1.1 以来 C#的第一个单点版本。C# 7.1 提供了三个新特性,其中有两个是成功有效的。

C# 7.1/7.2:default 字面量

default字面量旨在减少一些样板代码。下面是一个常见的例子:

复制代码
public Task<Order> GetOrderAsync(int orderKey, CancellationToken token = default(CancellationToken))

这多少有点啰嗦,因此,模仿 Visual Basic 的Nothing关键字,上述代码可以写成下面这样:

复制代码
public Task<Order> GetOrderAsync(int orderKey, CancellationToken token = default)

这行代码可以按照预期方式运行。但是,当使用一个可空的值类型时,问题就来了。

复制代码
public Task<Order> GetOrders(int? limit = default)

这行代码应该把limit参数置为空,但在 C# 7.1 中,它实际返回 0。

这个问题的修复计划在C# 7.2 中进行,该版本会随Visual Studio 15.5 一起发布。

C# 7.1:元组名称推断
自从引入了匿名类型,C#就可以隐式命名属性。例如,在下面这行代码中,对象y会拥有名为AB的属性。

复制代码
var y = new { x.A, x.B };

在 C# 7.1 中,值元组也具有这个特性。

复制代码
var z1 = (A: x.A, B: x.B); // 显式名称
var z2 = (x.A, x.B); // 推断名称

要了解更多有关元组名称推断的信息,请看下我们之前的报道

C# 7.1:Async Main

这里没有多少可说的。 Main 函数现在可以异步执行,这减少了之前需要编写的一些样板代码。

C# 7.2:条件 Ref

C#的条件操作符通常被称为“三元运算符”,因为这是这门语言中的唯一一个。C# 7.2 将会提供第二个三元操作符,名为条件Ref 操作符

这个小特性让开发人员可以在条件中使用 ref表达式。下面是提案中的一个例子:

复制代码
ref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);

注意,除了在靠近两种可能结果的地方需要使用ref关键字外,在包含整个表达式的括号外也需要使用ref关键字。

C# 7.2:起始分隔符

该特性扩展了在数值字面量中使用下划线的能力。下面的示例摘自提案:

复制代码
123 // C# 1.0 及更高版本可用
1_2_3 // C# 7.0 及更高版本可用
0x1_2_3 // C# 7.0 及更高版本可用
0b101 // C# 7.0 新增的二进制字面量
0b1_0_1 // C# 7.0 及更高版本可用
// 在 C# 7.2 中,_ 可以用在`0x`或`0b`之后
0x_1_2 // C# 7.2 及更高版本可用
0b_1_0_1 // C# 7.2 及更高版本可用

C# 7.2:非尾部命名参数

C#中的命名参数服务于两种目的:

  • 允许跳过可选参数;
  • 明确访问接口,尤其是Boolean参数。

该特性处理第二种情况。例如:

复制代码
void DoSomething(bool delayExecution, bool continueOnError, int maxRecords);
DoSomething(true, false, 100);

除非开发人员记住了函数签名,否则很难一眼就看出了truefalse对应什么。过去,开发人员可以写成下面这样:

复制代码
DoSomething(delayExecution: true, continueOnError: false, maxRecords: 100);

但是,如果对maxRecords参数没有疑问却还需要指定似乎就有点奇怪。在非尾部命名参数提案中,开发人员可以根据需要指定参数。

复制代码
DoSomething(delayExecution: true, continueOnError: false, 100);

编者注:当清晰度成为问题时,Enum仍然好于Boolean

C# 7.2:Private Protected

C#有 5 个访问级别:privateinternalprotectedprotectedinternalpublic。但是,CLR 还有第六个访问级别,名为FamANDAssem,“允许程序集中的子类型访问”。

冷知识:在 CLR 中,protected称为family,而internal称为assembly

借助新关键字“private protected”,开发人员可以使用 CLR 的FamANDAssem标识了。 Private Protected 提案说明了这样做的重要性:

在许多情况下,API 都会包含一些成员函数,只打算让提供该类型的程序集中的子类实现并使用。CLR 提供了用于此目的的访问级别,但 C#中没有。因此,别无选择,API 所有者要么诉诸于internal保护、自律或自定义分析器,要么使用protected,并提供额外的文档说明,虽然该类型的公开文档中有这个成员函数,但它并不是公有 API 的一部分。至于后者的例子,可以看下 Roslyn CSharpCompilationOptions中以 Common 开头的成员。

C# 7.2:只读引用

我们之前报道过只读引用,所以这里没什么新东西要介绍。本质上讲,只读引用只是为了说明开发人员希望通过引用传递结构从而获得性能收益,而不是真正改变值的能力。

目前,只读引用提案尚处于原型阶段,还没有实现。

ref-like 类型编译时安全强化 [7.2 提案]

该 C#特性又称为“内部指针”或“ref-like类型”。该提案旨在让编译器可以要求特定的类型(Span<T>)仅出现在栈上。该特性仅对高性能场景而言比较重要。从我们上次报道以来,ref-like 类型提案没有任何变化。

放弃的特性

以下特性没有被标记为 7.2 提案的一部分。虽然这不是说一定不会标记,但可能不会很快发生。

查看英文原文 Catching up with C# 7.1 and C# 7.2

2017 年 11 月 05 日 18:002552
用户头像

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

关注

评论

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

从40万美元创业到执掌5500亿美元的帝国,聊聊《苏世民:我的经验与教训》这本书

万佳

读书笔记 商业 苏世民 金融 企业管理

谈谈控制感(8):元控制感

史方远

职场 心理 成长

Java 简介

编号94530

Java jdk java简介 jdk8

【Howe 学 JAVA】断点续传原理精析及简单实现

Howe

Java 断点续传

用 R 语言打个印咋就这么费事儿呢

张利东

可视化 R

如何为一家移动游戏公司制定产品策略(严肃长文)

谢锐 | Frozen

游戏出海 手机游戏

Android与JS的交互:JsBridge的简单使用

brave heart

Java android

【有奖调研】大数据与人工智能从业者有奖需求用研

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

真香!谷歌终与美国国防部合作,签署百万美金云服务合同

神经星星

云计算 互联网巨头 互联网 谷歌Google

【写作群星榜】本周写作平台优秀作者&文章排名

InfoQ写作平台

写作平台 排行榜

学会独立思考的前提

fahsa

自我提升

SpringCloud之服务提供者与消费者

北漂码农有话说

python实现·十大排序算法之插入排序(Insertion Sort)

南风以南

Python 排序算法 插入排序

工厂模式——这一篇真够了

海星

Java 架构 面试 设计模式 工厂模式

Jenkins:批量自动将 Maven 类型 Job 迁移到自由风格类型

donghui2020

jenkins

写给管理者的睡前故事

石云升

读书笔记 故事 管理者

力扣刷题盛行,风气由何而来?

南湾小猪

刷题

现代生活对我们大脑的危害

七镜花园-董一凡

生活质量

回“疫”录(23):如果岁月可回头

小天同学

疫情 个人成长 回忆录 现实纪录 纪实

突然的自我

月白

自我思考

系统化服务构建-调用链管理

图南日晟

微服务 全链路监控 链路追踪

G-P-M 调度模型深度解析之手撸一个高性能 goroutine 池

潘建锋

go 并发编程 协程

自我革新最难的是革自己的命

史方远

职场 成长

一文读懂Java注解

JFound

Java

Dubbo - 初识Apache Dubbo

Java收录阁

dubbo

系统服务构建-BFF 助力前后端分离

图南日晟

php 微服务 BFF

unittest框架

Flychen

Python 自动化测试 unittest

Android | Tangram动态页面之路(七)硬核的Virtualview

哈利迪

android

2020年4月北京BGP机房网络质量评测报告

BonreeAPM

运维 服务器 机房 数据中心 评测

乙己说:LFU实现思路整理

再见小飞侠

缓存 LeetCode

我是如何拿下PMP认证和系统架构设计师考试的?

Nick

C# 7.1、7.2特性追踪-InfoQ