C#7.3 新增功能
C# 7.3 版本有两个主要主题。 第一个主题提供使安全代码的性能与不安全代码的性能一样好的功能。 第二个主题提供对现有功能的增量改进。 此外,在此版本中添加了新的编译器选项。
以下新增功能支持使安全代码获得更好的性能的主题:
- 无需固定即可访问固定的字段。
- 可以重新分配
ref
本地变量。 - 可以使用
stackalloc
数组上的初始值设定项。 - 可以对支持模式的任何类型使用
fixed
语句。 - 可以使用其他泛型约束。
对现有功能进行了以下增强:
- 可以使用元组类型测试
==
和!=
。 - 可以在多个位置使用表达式变量。
- 可以将属性附加到自动实现的属性的支持字段。
- 由
in
区分的参数的方法解析得到了改进。 - 重载解析的多义情况现在变得更少。
新的编译器选项为:
-publicsign
,用于启用程序集的开放源代码软件 (OSS) 签名。-pathmap
用于提供源目录的映射。
你应能够安全地编写性能与不安全代码一样好的 C# 代码。 安全代码可避免错误类,例如缓冲区溢出、杂散指针和其他内存访问错误。 这些新功能扩展了可验证安全代码的功能。努力使用安全结构编写更多代码。 这些功能使其更容易实现。
unsafe struct S
{
public fixed int myFixedField[];
}
在早期版本的 C# 中,需要固定变量才能访问属于 myFixedField
的整数之一。 现在,以下代码进行编译,而不将变量 p
固定到单独的 fixed
语句中:
class C
{
static S s = new S(); unsafe public void M()
{
int p = s.myFixedField[];
}
}
变量 p
访问 myFixedField
中的一个元素。 无需声明单独的 int*
变量。 请注意,你仍然需要 unsafe
上下文。 在早期版本的 C# 中,需要声明第二个固定的指针:
class C
{
static S s = new S(); unsafe public void M()
{
fixed (int* ptr = s.myFixedField)
{
int p = ptr[];
}
}
}
有关详细信息,请参阅有关 fixed
语句的文章。
ref
局部变量进行初始化后,可能会对其重新分配,以引用不同的实例。 以下代码现在编译:ref VeryLargeStruct refLocal = ref veryLargeStruct; // 初始化
refLocal = ref anotherVeryLargeStruct; // 重新分配后,反射引用不同的存储。
有关详细信息,请参阅有关 ref
返回和 ref
局部变量以及 foreach
的文章。
var arr = new int[] {, , };
var arr2 = new int[] {, , };
现在,可向使用 stackalloc
进行声明的数组应用同一语法:
int* pArr = stackalloc int[] {, , };
int* pArr2 = stackalloc int[] {, , };
Span<int> arr = stackalloc [] {, , };
有关详细信息,请参阅stackalloc
运算符一文。
fixed
语句支持有限的一组类型。 从 C# 7.3 开始,任何包含返回 ref T
或 ref readonly T
的 GetPinnableReference()
方法的类型均有可能为 fixed
。 添加此功能意味着 fixed
可与 System.Span<T> 和相关类型配合使用。
有关详细信息,请参阅语言参考中的 fixed
语句一文。
现在,可以将类型 System.Enum 或 System.Delegate 指定为类型参数的基类约束。
现在也可以使用新的 unmanaged
约束来指定类型参数必须为“非托管类型” 。 “非托管类型” 不是引用类型,且在任何嵌套级别都不包含任何引用类型。
有关详细信息,请参阅有关 where
泛型约束和类型参数的约束的文章。
将这些约束添加到现有类型是不兼容的更改。 封闭式泛型类型可能不再满足这些新约束的要求。
以下功能提供了对语言中的功能的改进。 这些功能提升了在编写 C# 时的效率。
[field: SomeThingAboutFieldAttribute]
public int SomeProperty { get; set; }
属性 SomeThingAboutFieldAttribute
应用于编译器生成的 SomeProperty
的支持字段。 有关详细信息,请参阅 C# 编程指南中的属性。
in
参数修饰符时,这两个方法将导致多义性:static void M(S arg);
static void M(in S arg);
现在,通过值(前面示例中的第一个)的重载比通过只读引用版本的重载更好。 若要使用只读引用参数调用版本,必须在调用方法前添加 in
修饰符。
有关详细信息,请参阅有关 in
参数修饰符的文章。
out
变量声明的语法进行了扩展,以包含字段初始值设定项、属性初始值设定项、构造函数初始值设定项和查询子句。 它允许使用如以下示例中所示的代码:public class B
{
public B(int i, out int j)
{
j = i;
}
} public class D : B
{
public D(int i) : base(i, out var j)
{
Console.WriteLine($"The value of 'j' is {j}");
}
}
在每个版本中,对重载解析规则进行了更新,以解决多义方法调用具有“明显”选择的情况。此版本添加了三个新规则,以帮助编译器选取明显的选择:
- 当方法组同时包含实例和静态成员时,如果方法在不含实例接收器或上下文的情况下被调用,则编译器将丢弃实例成员。 如果方法在含有实例接收器的情况下被调用,则编译器将丢弃静态成员。 在没有接收器时,编译器将仅添加静态上下文中的静态成员,否则,将同时添加静态成员和实例成员。 当接收器是不明确的实例或类型时,编译器将同时添加两者。 静态上下文(其中隐式
this
实例接收器无法使用)包含未定义this
的成员的正文(例如,静态成员),以及不能使用this
的位置(例如,字段初始值设定项和构造函数初始值设定项)。 - 当一个方法组包含类型参数不满足其约束的某些泛型方法时,这些成员将从候选集中移除。
- 对于方法组转换,返回类型与委托的返回类型不匹配的候选方法将从集中移除。
你将注意到此更改,因为当你确定哪个方法更好时,你将发现多义方法重载具有更少的编译器错误。
-publicsign
编译器选项指示编译器使用公钥对程序集进行签名。 程序集被标记为已签名,但签名取自公钥。 此选项使你能够使用公钥在开放源代码项目中构建签名的程序集。
有关详细信息,请参阅 -publicsign 编译器选项一文。
-pathmap
编译器选项指示编译器将生成环境中的源路径替换为映射的源路径。 -pathmap
选项控制由编译器编写入 PDB 文件或为 CallerFilePathAttribute 编写的源路径。
有关详细信息,请参阅 -pathmap 编译器选项一文。
C#7.3 新增功能的更多相关文章
- ADO.NET 中的新增功能
ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...
- .NET Framework3.0/3.5/4.0/4.5新增功能摘要
Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
[源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...
- PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器
PHP V5.2:开始 2006 年 11 月发布了 PHP V5.2,它包括许多新增功能和错误修正.它废止了 5.1 版并被推荐给所有 PHP V5 用户进行升级.我最喜欢的实验室环境 —— Win ...
- WPF4.5 中的新增功能和增强功能的信息
本主题包含有关 Windows Presentation Foundation (WPF) 版本 4.5 中的新增功能和增强功能的信息. 本主题包含以下各节: 功能区控件 改善性能,当显示大时设置分组 ...
- .NET Framework 4.5、4.5.1 和 4.5.2 中的新增功能
.NET Framework 4.5.4.5.1 和 4.5.2 中的新增功能 https://msdn.microsoft.com/zh-cn/library/ms171868.aspx
- openstack【Kilo】汇总:包括20英文文档、各个组件新增功能及Kilo版部署
OpenStack Kilo版本发布 20英文文档OpenStack Kilo版本文档汇总:各个操作系统安装部署.配置文档.用户指南等文档 Kilo版部署 openstack[Kilo]入门 [准备篇 ...
- hadoop2.6.0汇总:新增功能最新编译 32位、64位安装、源码包、API下载及部署文档
相关内容: hadoop2.5.2汇总:新增功能最新编译 32位.64位安装.源码包.API.eclipse插件下载Hadoop2.5 Eclipse插件制作.连接集群视频.及hadoop-eclip ...
- cloudstack4.4新增功能前瞻
cloudstack4.4.0新功能前瞻 转载请注明地址:http://blog.csdn.net/zt689/article/details/37698989 1. cloudstack4.4. ...
- SQL Server 2016 Alwayson新增功能
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/ 概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alw ...
随机推荐
- CEGUI 0.7.7 VS2010+SP3 编译过程
1 在官方网站http://www.cegui.org.uk/ 下载最新的CEGUI 源代码 版本是0.7.7 2 下载编译需要用到的依赖文件包 将解压后的文件夹 Dependencies 和CEGU ...
- 下载Cloudera Repo
wget http://archive-primary.cloudera.com/gplextras5/redhat/6/x86_64/gplextras/cloudera-gplextras5.re ...
- 网络基础与FTP准备
一网络基础 1.端口: 端口是为了将同一台电脑上的不同程序进行隔离 (IP是在找电脑,端口是在找电脑上的程序) 实例: MySQL是一个软件,帮助我们在硬盘上进行操作,默认端口是3306 Redis是 ...
- cloudsim 3.0.3下载与安装教程
1.配置jdk(之前的文章都讲解过,这里就不具体说了) 2.安装eclipse或MyEclipse 3.下载cloudsim压缩包,这个的官网是需要FQ,这里贴上我的下载地址 链接:https://p ...
- 使用Scrapy爬取图片入库,并保存在本地
使用Scrapy爬取图片入库,并保存在本地 上 篇博客已经简单的介绍了爬取数据流程,现在让我们继续学习scrapy 目标: 爬取爱卡汽车标题,价格以及图片存入数据库,并存图到本地 好了不多说,让我们实 ...
- 实战Java的反射机制
众所周知,Java要调用某个对象的方法首先需要对象实例化后才能调用. 而实例化对象常见的就是new执行和spring(DI)的依赖注入了. Spring的DI其实就是以反射作为最基础的技术手段. 一. ...
- rbash限制用户执行的命令
rbash限制用户执行的命令 软连接 sudo ln -s /bin/bash /bin/rbash sudo bash -c 'echo "/bin/rbash" >> ...
- 跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心
SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwic ...
- RT-thread线程创建:动态线程与静态线程
本文介绍了如何创建一个动态线程和一个静态线程 RT-thread版本:RT-thread system 3.1.0 开发环境:MDK5 为了编程方便,创建了sample1.c文件,然后添加到工程中 话 ...
- redux和react-redux做简单组件控制
这次我们用两种方式实现以下要求 1.三个组件 2.第一个组件有两个按钮 分别控制第二和第三个组件年龄和姓名的改变 3第二个组件展示姓名,第三个组件展示年龄 用到哪些插件 store redux 一 ...