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\u0026lt;T\u0026gt;。其中列举了如下几个原因:

\\

\

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

\\

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

\\

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

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

\\

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

\\

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

\\

C# 8.0原型

\\

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

\\

  • 可空引用类型(Nullable Reference Types):这个特性使得所有的引用类型在默认情况下都是不可空(non-nullable)的。如果能够使用非空类型,你还会使用T(模板)吗?就像你会使用可空结构一样。\\t
  • 默认接口方法(Default Interface Methods):这个特性使得C#引入了有限形式的多重继承。\

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

\\


感谢Mister Who对本文的审校。

\\

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

C# 7.2和8.0路线图相关推荐

  1. Entity Framework 6.3 和 EF Core 3.0 路线图

    尽管脱离了 .NET Core 发布循环,但是 EF Core 正在开发其 3.0 路线图.除此之外,还对原来的 Entity Framework 进行了一些重要的变更. 更多服务器端的查询 将 LI ...

  2. 一步步学习EF Core(3.EF Core2.0路线图)

    前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西.不过我倒是发现了EF Core的路线图更新了,下面我们就来看看 今天我们来看看最新的EF Core ...

  3. 万向区块链蜂巢学院 | 关于ETH2.0路线图,搞研究的大脑在想什么?

    以太坊2.0是2020年区块链行业最火热的话题之一.万向区块链蜂巢学院线上公开课第42期,邀请了以太坊爱好者社区负责人阿剑.链闻研究总监潘致雄.MYKEY研究部门负责人姚翔.HashKey Capit ...

  4. 国外博客透露JavaFX 2.0路线图

    [国外博客]大家注意否,JavaFX脚本语言已经转化为纯粹的Java APIs for JavaFX.当然,令人印象深刻的是其背后的JavaFX团队.仅仅2年的时间,从1.0到1.3.x,增加了很多的 ...

  5. eos和以太坊有什么关系_以太坊 2.0是什么?

    ETH2.0 是以太坊的计划升级方案.在接下来的几年里,ETH2.0 的设计者们计划完全革新以太坊的共识系统,并引入以太坊现有的世界状态.由于涉及面极广,我们也无法准确地说明 ETH2.0 将包括或者 ...

  6. Google发布Android Studio 1.0

     第一个IDE稳定版本:Google发布Android Studio 1.0 摘要:Google于今天发布了Android Studio 1.0,其新增的突出特性包括:首次安装向导方面.示例导入和 ...

  7. Dubbo 3.0 - 开启下一代云原生微服务

    作者 | 郭浩(项升)  阿里巴巴经济体 RPC 框架负责人 **导读:**本文整理自作者于 2020 年云原生微服务大会上的分享<Dubbo3.0 - 开启下一代云原生微服务>,主要介绍 ...

  8. 阿里集团业务驱动的升级——Dubbo 3.0 的演进思路

    简介:阿里云在 2020年底提出了"三位一体"理念,目标是希望将"自研技术"."开源项目"."商业产品"形成统一的技术体 ...

  9. 使用ILSpy探索C#7.0新增功能点

    第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 ...

最新文章

  1. 数据蒋堂 | 如何将数据热导出到文件
  2. Nagios监控linux服务器
  3. Linux装多个apache,windows linux如何安装多个apache?
  4. 使用ALV中输出ICON
  5. C语言函数题-取子串 (10分)
  6. 转载一些关于博客的文章
  7. 原生Javascript 操作 css类名 - 踩坑篇
  8. 推荐系统遇上深度学习(十一)--神经协同过滤NCF原理及实战
  9. CEF JS实现获取剪贴板图片的DataURL
  10. python怎么设置加密,Python 加密的实例详解
  11. 【交通标志识别】基于matlab GUI模板匹配交通标志识别【含Matlab源码 1059期】
  12. python图形化编程 在线教程_使用Python Editor进行在线图形化编程
  13. #10019. 「一本通 1.3 例 2」生日蛋糕
  14. 发动机太热 请不要用冷水降温
  15. 2023百度统计被人恶意刷广告解决办法
  16. 华为天才少年造出自动驾驶单车!图纸已开源,硬件成本一万,B 站老板:重新定义「自行」车...
  17. JavaScript W3School教程 思维导图
  18. 软路由初步尝试-U盘运行LEDE
  19. 算法——PostOffice
  20. myeclipse ant 编译java_Java MyEclipse下Ant build.xml简单实例详解

热门文章

  1. JSON转换和毫秒时间
  2. 分布式存储系统sheepdog
  3. RoadFlow工作流引擎安装与部署
  4. tomcat访问webapp下面工程的文件含有软连接
  5. [20180627]测试bbed是否支持管道命令.txt
  6. 10 python中的常量
  7. 从VirtualBox虚拟主机访问NAT客户机的方法
  8. html5关于定位功能的实现
  9. OSPF中stub area配置实例
  10. 选择适合自己的那款操作系统