C# 7.3 版本有两个主要主题。 第一个主题提供使安全代码的性能与不安全代码的性能一样好的功能。 第二个主题提供对现有功能的增量改进。 此外,在此版本中添加了新的编译器选项。

以下新增功能支持使安全代码获得更好的性能的主题:

  • 无需固定即可访问固定的字段。
  • 可以重新分配 ref 本地变量。
  • 可以使用 stackalloc 数组上的初始值设定项。
  • 可以对支持模式的任何类型使用 fixed 语句。
  • 可以使用其他泛型约束。

对现有功能进行了以下增强:

  • 可以使用元组类型测试 == 和 !=
  • 可以在多个位置使用表达式变量。
  • 可以将属性附加到自动实现的属性的支持字段。
  • 由 in 区分的参数的方法解析得到了改进。
  • 重载解析的多义情况现在变得更少。

新的编译器选项为:

  • -publicsign,用于启用程序集的开放源代码软件 (OSS) 签名。
  • -pathmap用于提供源目录的映射。
01 启用更高效的安全代码

你应能够安全地编写性能与不安全代码一样好的 C# 代码。 安全代码可避免错误类,例如缓冲区溢出、杂散指针和其他内存访问错误。 这些新功能扩展了可验证安全代码的功能。努力使用安全结构编写更多代码。 这些功能使其更容易实现。

1.1 索引 fixed 字段不需要进行固定
定义一个结构体
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 语句的文章。

1.2 可能会重新分配 ref 局部变量
现在,在对 ref 局部变量进行初始化后,可能会对其重新分配,以引用不同的实例。 以下代码现在编译:
ref VeryLargeStruct refLocal = ref veryLargeStruct; // 初始化
refLocal = ref anotherVeryLargeStruct; // 重新分配后,反射引用不同的存储。

有关详细信息,请参阅有关 ref 返回和 ref 局部变量以及 foreach 的文章。

1.3 stackalloc 数组支持初始值设定项
当你对数组中的元素的值进行初始值设定时,你已能够指定该值:
var arr =  new int[] {, , };
var arr2 = new int[] {, , };

现在,可向使用 stackalloc 进行声明的数组应用同一语法:

int* pArr = stackalloc int[] {, , };
int* pArr2 = stackalloc int[] {, , };
Span<int> arr = stackalloc [] {, , };

有关详细信息,请参阅stackalloc运算符一文。

1.4 更多类型支持 fixed 语句

fixed 语句支持有限的一组类型。 从 C# 7.3 开始,任何包含返回 ref T 或 ref readonly T的 GetPinnableReference() 方法的类型均有可能为 fixed。 添加此功能意味着 fixed 可与 System.Span<T> 和相关类型配合使用。

有关详细信息,请参阅语言参考中的 fixed 语句一文。

1.5 增强的泛型约束

现在,可以将类型 System.Enum 或 System.Delegate 指定为类型参数的基类约束。

现在也可以使用新的 unmanaged 约束来指定类型参数必须为“非托管类型” 。 “非托管类型” 不是引用类型,且在任何嵌套级别都不包含任何引用类型。

有关详细信息,请参阅有关 where 泛型约束类型参数的约束的文章。

将这些约束添加到现有类型是不兼容的更改。 封闭式泛型类型可能不再满足这些新约束的要求。

02 提升了现有功能

以下功能提供了对语言中的功能的改进。 这些功能提升了在编写 C# 时的效率。

2.1 元组支持 == 和 !=

C# 元组类型现在支持 == 和 !=。 有关详细信息,请参阅有关元组一文中的转换等式部分。

2.2 将特性添加到自动实现的属性的支持字段
现在支持此语法:
[field: SomeThingAboutFieldAttribute]
public int SomeProperty { get; set; }

属性 SomeThingAboutFieldAttribute 应用于编译器生成的 SomeProperty 的支持字段。 有关详细信息,请参阅 C# 编程指南中的属性

2.3 in 方法重载解析决胜属性
在添加 in 参数修饰符时,这两个方法将导致多义性:
static void M(S arg);
static void M(in S arg);

现在,通过值(前面示例中的第一个)的重载比通过只读引用版本的重载更好。 若要使用只读引用参数调用版本,必须在调用方法前添加 in 修饰符。

有关详细信息,请参阅有关 in 参数修饰符的文章。

2.4 扩展初始值设定项中的表达式变量
已对在 C# 7.0 中添加的允许 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}");
}
}
2.5 改进了重载候选项

在每个版本中,对重载解析规则进行了更新,以解决多义方法调用具有“明显”选择的情况。此版本添加了三个新规则,以帮助编译器选取明显的选择:

  1. 当方法组同时包含实例和静态成员时,如果方法在不含实例接收器或上下文的情况下被调用,则编译器将丢弃实例成员。 如果方法在含有实例接收器的情况下被调用,则编译器将丢弃静态成员。 在没有接收器时,编译器将仅添加静态上下文中的静态成员,否则,将同时添加静态成员和实例成员。 当接收器是不明确的实例或类型时,编译器将同时添加两者。 静态上下文(其中隐式 this 实例接收器无法使用)包含未定义 this 的成员的正文(例如,静态成员),以及不能使用 this 的位置(例如,字段初始值设定项和构造函数初始值设定项)。
  2. 当一个方法组包含类型参数不满足其约束的某些泛型方法时,这些成员将从候选集中移除。
  3. 对于方法组转换,返回类型与委托的返回类型不匹配的候选方法将从集中移除。

你将注意到此更改,因为当你确定哪个方法更好时,你将发现多义方法重载具有更少的编译器错误。

03 新的编译器选项
新的编译器选项支持 C# 程序的新版本和 DevOps 方案。
3.1 公共或开放源代码签名

-publicsign 编译器选项指示编译器使用公钥对程序集进行签名。 程序集被标记为已签名,但签名取自公钥。 此选项使你能够使用公钥在开放源代码项目中构建签名的程序集。

有关详细信息,请参阅 -publicsign 编译器选项一文。

3.2 pathmap

-pathmap 编译器选项指示编译器将生成环境中的源路径替换为映射的源路径。 -pathmap 选项控制由编译器编写入 PDB 文件或为 CallerFilePathAttribute 编写的源路径。

有关详细信息,请参阅 -pathmap 编译器选项一文。

C#7.3 新增功能的更多相关文章

  1. ADO.NET 中的新增功能

    ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...

  2. .NET Framework3.0/3.5/4.0/4.5新增功能摘要

    Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...

  3. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

    [源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...

  4. PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器

    PHP V5.2:开始 2006 年 11 月发布了 PHP V5.2,它包括许多新增功能和错误修正.它废止了 5.1 版并被推荐给所有 PHP V5 用户进行升级.我最喜欢的实验室环境 —— Win ...

  5. WPF4.5 中的新增功能和增强功能的信息

    本主题包含有关 Windows Presentation Foundation (WPF) 版本 4.5 中的新增功能和增强功能的信息. 本主题包含以下各节: 功能区控件 改善性能,当显示大时设置分组 ...

  6. .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

  7. openstack【Kilo】汇总:包括20英文文档、各个组件新增功能及Kilo版部署

    OpenStack Kilo版本发布 20英文文档OpenStack Kilo版本文档汇总:各个操作系统安装部署.配置文档.用户指南等文档 Kilo版部署 openstack[Kilo]入门 [准备篇 ...

  8. hadoop2.6.0汇总:新增功能最新编译 32位、64位安装、源码包、API下载及部署文档

    相关内容: hadoop2.5.2汇总:新增功能最新编译 32位.64位安装.源码包.API.eclipse插件下载Hadoop2.5 Eclipse插件制作.连接集群视频.及hadoop-eclip ...

  9. cloudstack4.4新增功能前瞻

    cloudstack4.4.0新功能前瞻 转载请注明地址:http://blog.csdn.net/zt689/article/details/37698989 1.   cloudstack4.4. ...

  10. SQL Server 2016 Alwayson新增功能

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/ 概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alw ...

随机推荐

  1. Qt使用com组件的一点小心得(使用Qt自带的工具dumpcpp生成.h和.cpp文件)

    这几天工作中要用到Qt调用com组件,主要用到的类型有dll和ocx,使用他们的方法很简单:1.将com组件注册到系统中.2.使用Qt自带的工具dumpcpp将com组件生成cpp和头文件.3.然后就 ...

  2. Rainyday.js – Rendering Raindrops with JavaScript

    Posted · Category:GPL License,Tools 直击现场 The idea behind Rainyday.js is to create a JavaScript libra ...

  3. CSS3 Maker提供了10个最为常用的CSS3属性在线生成工具

    CSS3 Maker提供了10个最为常用的CSS3属性在线生成工具,比如说border-radius.gradient.transfrom.animation.transition.rgba.text ...

  4. Windows 7 频繁提示:计算机的内存不足

    最近由于同时打开的程序比较多,Windows 7 频繁提示:计算机的内存不足,如下图: 问题原因: 经过一番尝试,得出一个大概的结论:当虚拟内存空间的大小小于物理内存空间的大小时,一旦程序开的太多,物 ...

  5. 利用POi3.8导出excel产生大量xml临时文件怎么办?

    在实际项目中,经常会用到POI3.8来导出excel.而导出excel的时候,会因为残留大量以.xml结尾的文件而导致服务器存储空间急剧增长,最后导致系统挂了.为此,该怎么办呢? .xml后缀残留文件 ...

  6. 第一个SpringBoot测试实例

    1.SpringBoot项目构建:http://start-spring.io   自动化构建SpringBoot项目,保存在本地并解压 2.安装gradle并配置gradle环境 3.配置阿里云ma ...

  7. 在centos7上安装Docker CE

    Docker CE的基本安装 https://docs.docker.com/engine/installation/linux/docker-ce/centos/ 一.系统要求 1.安装Docker ...

  8. 《大型网站系统与Java中间件》读书笔记 (中)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...

  9. Spring Boot2从入门到实战:统一异常处理

    都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效 ...

  10. python方法和函数集锦

    方法的使用: 变量.方法名(参数) 函数的使用: 函数名(参数) 字符串 1.删除空白 rstrip(): 返回去掉尾部的空格后的字符串.(不改变原字符串) lstrip(): 去掉首部空格 stri ...