「如何实现流动式软件发布」线上课堂开课啦,快来报名参与课堂抽奖吧~ 了解详情
写点什么

C# 7.2 和 8.0 路线图

2017 年 6 月 21 日

C# 7.2 和 8.0 的许多新功能已经列入了计划,其中包括空引用类型和有限形式的多重继承。

只读引用和只读结构体 [7.2 原型]

首先提到的是只读引用和结构体。简单来讲,这项特性使得C#能够使用类似const 的参数来提高性能。像我们所知道的“ref 只读参数”和简单的“in 参数”,这些特性使得大的结构体能够通过引用来进行传递,并且不允许对其进行修改。

这个提案中的一部分就是只读结构体。开发人员将一个结构体标记为只读之后,表示任何方法都不能对这个结构体进行修改。这会对性能有很大提升,因为它会告诉编译器,它可以跳过通常用于防止意外修改只读变量的复制操作。

Blittable 类型 [7.2 提案]

维基百科上是这样描述 blittable 类型的:

在微软的.NET 框架中,数据在托管代码和非托管代码中的内存表示是截然不同的。然而,blittable 类型被定义为在这两种不同的环境下,数据在内存中的表示是完全相同的,并且可以直接共享。

Non-blittable 类型包括 Boolean、string、char 以及所有的引用类型。如果一个结构体包含了其中的一种类型,那么这个结构体本身也是 non-blittable 的。

目前,C#编译器通过检查一个类型的结构来推断它是否是 blittable 的。这在过去引发了一些问题,因为有时增加一个新的字段会使得一个 blittable 类型变成 non-blittable,然而在某些情况下,这种变化是致命的。

Blittable 类型提案中提到,使用关键字“blittable”能够明确地将一个结构体定义为 blittable 的。如果之后它的类型被修改为 non-blittable 的,编译器就会报错。

为了保证长期的向后兼容性,被定义为 blittable 的结构中只能包含同样明确定义为 blittable 的结构。此外,结构中不能使用 StructLayout(LayoutKind.Auto)] 。它表示的是结构体在物理内存中的排列方式。Explicit layout 和 sequential layout 都是可以使用的。

注意:能够修改一个结构体的 LayoutKind 或者 Pack 被认为是一个突破性的改进,因为它改善了非托管代码访问结构体的方式。

Microsoft 担心这个特性的过渡期。低层的类库必须采用明确的 blittable 类型,更高层的类库才能使用它们。

ref-like 类型编译期安全增强 [7.2 提案]

这个特性也叫做“interior pointer”或者“类 ref 类型(ref-like types)”。该提案允许编译器要求只能有特定的类型出现在栈上,比如 Span。其中列举了如下几个原因:

  1. Span在语义上表示的是一个包含了一个引用和一个范围的结构体(ref T data, int length)。不管它的实现是怎样的,对这种类型的结构体的写入操作并不是原子的。并发地对这个结构进行“撕裂(tearing)”可能会导致它的长度和数据不匹配,有可能会引起超出访问范围(out-of-range)和类型不安全,这最终可能会导致 GC 时的堆崩溃,尽管代码看起来似乎是“安全”的。
  2. 在一些 Span的实现中,它的字段中会包含一个托管指针(managed pointer)。托管指针不支持堆对象的字段,并且将托管指针指向放在 GC 堆上的代码会在 JIT(Just-in-time)期间崩溃。
  3. Span允许引用局部堆栈帧中的数据:单独的局部变量或者栈上分配的数组。当 Span的实例的生命周期超过了引用的数据时,这会导致未定义的行为,包括类型安全违规和堆崩溃。

ref-like 类型有如下几种使用限制:

  • ref-like 类型不能作为数组的元素
  • ref-like 类型不能用作泛型类型参数
  • ref-like 变量不能被装箱
  • ref-like 类型不能作为普通的非 ref-like 类型的字段
  • 一些间接限制,例如不允许在异步方法中使用 ref-like 类型,异步方法不支持 ref-like 类型字段

事实上,这意味着 ref-like 类型仅能被用作参数、局部变量以及某些情况下的返回值。ref-like 类型能够包含另一个 ref-like 类型。

所有的 ref-like 类型都是只读结构体(详见上方描述)。

像 ref 类型一样,ref-like 类型最终可能会成为“单赋值(single-assignment)”类型。该提案也提到了其他保障安全的方法,但是这个方法对编译器的负担是最小的。

C# 8.0 原型

C# 8 的两个新特性已经到达了原型阶段:

查看英文原文 C# 7.2 and 8.0 Roadmap


感谢 Mister Who 对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017 年 6 月 21 日 19:003439

评论

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

Mybatis系列全解(六):Mybatis最硬核的API你知道几个?

潘潘和他的朋友们

Java 后端 mybatis 后端开发 mybatis源码

奥里给,通过这几份PDF,终于拿到了阿里,腾讯等一线大厂的offer

Java架构之路

Java 程序员 架构 面试 编程语言

2021 年产品训练营 - 第二周作业

Meng

产品训练营第二周作业-利益相关者

jpcr987i

极客时间产品经理训练营第 2 次作业

待注册

产品训练营 第二周作业

万顷湖天碧

产品训练营

第二次作业&第三次作业

yoki

新世界的智能,旧梦中的暖气

脑极体

在质量管理中掘金

俊毅

作业 - 第二章 产品思维和产品意识

hao hao

新浪微博利益相关方分析

🙈🙈🙈

极客大学产品经理训练营

席卷图文学习前端Flex布局

魔王哪吒

html 面试 前端 html/css Flex

极客大学·产品经理训练营·第二章作业

二大爷

产品经历

笔记1-2

🍑

极客大学产品经理训练营

产品课程-第二周作业

狗三

Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

潘潘和他的朋友们

Java 后端 mybatis 后端开发 mybatis源码

小程序抽奖助手产品利益相关者分析

夏天的风

产品经理训练营

第二周作业

纳豆卡玛

第二周作业

自从上了K8S,项目更新都不带停机的!

Java架构师迁哥

MapReduce博文体系

小马哥

大数据 mapreduce 知识体系 架构师 七日更

产品经理训练营 第二周作业记录

玲玲

产品思维 产品经理训练营

太牛了!这是什么神仙级的面试pdf(含答案),跳槽大厂不是问题

Java架构之路

Java 程序员 架构 面试 编程语言

还不知道简历如何写?就该这样写!

yes

面试 简历

训练营-第二周作业

💥萝贝桃儿

产品经理训练营第 0 期 - 第二周作业

🍑

极客大学产品经理训练营

产品经理训练营-第二周作业

月亮 😝

Alibaba内部晋升手册面试题集 ,Java岗位

Java架构之路

Java 程序员 架构 面试 编程语言

产品经理训练营 Week2 作业

Mai

产品经理训练营第二周作业 - 利益相关方

Denny-xi

产品经理 产品经理训练营

第2章:产品思维作业

让时间说真话

产品经理

产品训练营第二周作业

朱航

C# 7.2和8.0路线图-InfoQ