C# 7.2和8.0路线图

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

  1. Span<T>在语义上表示的是一个包含了一个引用和一个范围的结构体(ref T data, int length)。不管它的实现是怎样的,对这种类型的结构体的写入操作并不是原子的。并发地对这个结构进行“撕裂(tearing)”可能会导致它的长度和数据不匹配,有可能会引起超出访问范围(out-of-range)和类型不安全,这最终可能会导致GC时的堆崩溃,尽管代码看起来似乎是“安全”的。

  2. 在一些Span<T>的实现中,它的字段中会包含一个托管指针(managed pointer)。托管指针不支持堆对象的字段,并且将托管指针指向放在GC堆上的代码会在JIT(Just-in-time)期间崩溃。

  3. Span<T>允许引用局部堆栈帧中的数据:单独的局部变量或者栈上分配的数组。当Span<T>的实例的生命周期超过了引用的数据时,这会导致未定义的行为,包括类型安全违规和堆崩溃。

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的两个新特性已经到达了原型阶段:

  • 可空引用类型(Nullable Reference Types):这个特性使得所有的引用类型在默认情况下都是不可空(non-nullable)的。如果能够使用非空类型,你还会使用T(模板)吗?就像你会使用可空结构一样。

  • 默认接口方法(Default Interface Methods):这个特性使得C#引入了有限形式的多重继承。

原文地址:http://www.infoq.com/cn/news/2017/06/CSharp-7.2


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis中的原理

01Mybatis的运行原理 运行过程中涉及到的类 1.1 Resources MyBatis中IO流的工具类 1.1 加载配置文件 1.2 SqlSessionFactoryBuilder() 构建器 1.2.1 作用:创建SqlSessionFactory接口的实现类 1.3 XMLConfigBuilder MyBatis全局配置文件内容构建器类 1.3.1 作用负责读取流内容并…

JavaFX UI控件教程(十九)之Hyperlink

翻译自 Hyperlink 本章介绍Hyperlink用于将文本格式化为超链接的控件。 所述Hyperlink类表示另一种类型的Labeled控制。图18-1演示了默认超链接实现的三种状态。 图18-1超链接控制的三种状态 创建超链接 示例18-1中显示了生成超链接的代码片段。 例18-1典型的超链接 Hype…

杨辉三角形

package com.wdl.day07;/*** 创建人 wdl* 创建时间 2021/8/8* 描述*/ public class YangHuiTest {public static void main(String[] args) {int[][] yanghui new int[10][];for (int i 0; i < yanghui.length; i) {yanghui[i] new int[i 1];yanghui[i][0] 1;yanghui[i…

致我们最最最最最最最最最最最最最优秀的班主任——王老师

今天不说java&#xff0c;也不表C#&#xff0c;只来叙叙我们最最最最最最最最最最最最最优秀的班主任————王老师。亲爱的王老师&#xff0c;一起为3班孩子们的学业共同努力而使我倍感荣幸。回想从我们班报道以来&#xff0c;大大小小的各种奖状铺满那墨绿黑板的右侧&#x…

Asp.Net Core 发布到IIS

一、Asp.Net Core 发布到IIS 1.许多时候在WindowsServer服务器上已经安装了IIS&#xff0c;监听80端口&#xff0c;那么Asp.Net Core应用的自宿主就没法监听80端口 2.也就是在Widnows系统已经启用IIS服务的情况下&#xff0c;需要安装 NET Core Windows Server Hosting&#…

JavaFX UI控件教程(二十)之HTML Editor

翻译自 HTML Editor 在本章中&#xff0c;您将学习如何使用嵌入式HTML编辑器编辑JavaFX应用程序中的文本。 该HTMLEditor控件是一个功能齐全的富文本编辑器。它的实现基于HTML5的文档编辑功能&#xff0c;包括以下编辑功能&#xff1a; 文本格式包括粗体&#xff0c;斜体&am…

使用layui弹框实现添加时,当添加成功之后如何进行关闭当前窗口刷新父页面的数据

一看标题可能大家都比较模糊&#xff0c;我就去特意做了一个gif的演示图&#xff0c;结果发现太小了&#xff0c;就改成了现在的视频&#xff0c;视频地址&#xff1a; 使用layui实现对数据的增删改查演示案例实现技术是&#xff1a;ssh框架layui表格&#xff0c;即简单的对单表…

IdentityServer4 SigningCredential(RSA 证书加密)

IdentityServer4 默认提供了两种证书加密配置&#xff1a; services.AddIdentityServer().AddDeveloperSigningCredential().AddTemporarySigningCredential(); 这两种证书加密方式&#xff0c;都是临时使用&#xff0c;每次重启项目的时候&#xff0c;都会重新生成一个新的证…

JavaFX UI控件教程(二十一)之Tooltip

翻译自 Tooltip 在本章中&#xff0c;您将了解工具提示&#xff0c;即当鼠标光标悬停该控件时&#xff0c;可以为任何UI控件设置的控件。 的Tooltip类表示通常用于显示关于所述用户接口的控制附加信息的公共UI组件。可以通过调用setTooltip方法在任何控件上设置工具提示。 …

layui如何实现添加数据时关闭页面层,并实时刷新表格数据?

可能看到标题的你没有明白我到底想表达啥&#xff1f;&#xff08;我起名字时删改多遍&#xff0c;这是最终定下来的&#xff09;&#xff0c;不过&#xff0c;为了让大家看的明白&#xff0c;我专门去做了个演示视频&#xff1a;演示案例使用的技术&#xff1a;ssh框架layui表…

.net core 集成 autofac

1. Install Install-Package AutofacInstall-Package Autofac.Extensions.DependencyInjection 2.Startup 2.1 增加成員 public IContainer ApplicationContainer { get; private set; } 2.2 Startup.ConfigureServices 返回值改為&#xff1a;IServiceProvider 末尾中增…

JavaFX UI控件教程(二十三)之Menu

翻译自 Menu 本章介绍如何创建菜单和菜单栏&#xff0c;添加菜单项&#xff0c;将菜单分组&#xff0c;创建子菜单以及设置上下文菜单。 您可以使用以下JavaFX API类在JavaFX应用程序中构建菜单。 菜单栏 菜单项 菜单 CheckMenuItem RadioMenuItem 菜单 CustomMenuItem…

利用bootstraptable展示数据,对数据进行排序分页等操作

今天分享一下bootstraptable的相关技能点&#xff0c;由于第一次接触&#xff0c;所以刚开始碰了好多壁&#xff0c;于是趁现在过去不久&#xff0c;先总结总结。 Bootstraptable简单的来说就是一个表格控件&#xff0c;但是这个表格可不是一般的表格&#xff0c;分页、排序、…

JavaFX UI控件教程(二十四)之Password Field

翻译自 Password Field 在本章中&#xff0c;您将了解另一种类型的文本控件&#xff0c;即密码字段。 本PasswordField类实现一个专门的文本字段。通过显示回显字符串来隐藏用户键入的字符。图23-1显示了一个密码字段&#xff0c;其中包含提示消息。 图23-1带有提示消息的密…

3分钟内看完这,bootstraptable表格控件,受益匪浅!

今天分享一下bootstraptable的相关技能点&#xff0c;由于第一次接触&#xff0c;所以刚开始碰了好多壁&#xff0c;于是趁现在过去不久&#xff0c;先总结总结。Bootstraptable简单的来说就是一个表格控件&#xff0c;但是这个表格可不是一般的表格&#xff0c;分页、排序、查…

微软Azure开源开发者(深圳)峰会等你来

微软开发技术与云平台自从迈向开放、开源、跨平台的转型以来&#xff0c;已经受到全球开源社区们的关注。 从 Github 上高居世界首位的开源项目贡献数量&#xff0c;可以看到微软贯彻开源战略的实际行动。另一方面&#xff0c;微软也主动与开源社区做密切的技术交流。 本次 Azu…

这个点名系统太好用了,快来看看……

声明&#xff1a;软件为本人原创&#xff0c;后台回复&#xff1a;随机点名系统&#xff0c;免费下载。大家好&#xff0c;我是雄雄&#xff0c;昨天公众号给大家分享了windows系统和office办公软件激活的方法&#xff0c;正中好多粉丝的下怀。【原文在这里】今天在给大家分享一…

JavaFX UI控件教程(二十二)之Titled Pane和Accordion

翻译自 Titled Pane and Accordion 本章介绍如何在JavaFX应用程序中使用accordion和title窗格的组合。 标题窗格是带标题的面板。它可以打开和关闭&#xff0c;它可以封装任何Node诸如UI控件或图像以及添加到布局容器的元素组。 标题窗格可以使用手风琴控件进行分组&#x…

在ASP.NET Core 2.0中使用MemoryCache

说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下&#xff0c;但是在ASP.NET Core中System.Web已经不复存在。今儿个就简单的聊聊如何在ASP.NET Core中使用内存缓存。我们一般将经常访问但是又不是经常改变的数据放进缓存是再好不过了&#xff0c;…

在ASP.NET Core 2.0中使用CookieAuthentication

在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication&#xff08;认证&#xff09;&#xff0c;一个是Authorization&#xff08;授权&#xff09;。而前者是确定用户是谁的过程&#xff0c;后者是围绕着他们允许做什么&#xff0c;今天的主题就是关于在ASP…