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 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)

    之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...

  2. 亿方云(用电话或者qq沟通是远远不够的,容易忘还不能反复催,最好的方式就是指定一个平台,团队内的人定期查看最新记录)

    作者:城年链接:http://www.zhihu.com/question/20579359/answer/106319200来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新,文字发完后,好 ...

  3. linux 磁盘控件找到大文件

    df -lh Used:已经使用的空间 Avail:可以使用的空间 Mounted on:挂载的目录 然后找到大文件 du是linux下用看查看磁盘的命令 下面我们先一个目录的来查看空间占用情况 du ...

  4. vs2010添加TSTCON( ActiveX Control Test Container )工具

    vs2010中的TSTCON( ActiveX Control Test Container )工具非自动安装,而是作为一个例程提供.所以应找到该例程,并编译: 如vs2010安装在默认路径则 1, ...

  5. java多线程之管道流

    java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...

  6. 3016C语言_函数

    第六章 函数 6.1 函数概述 定义 函数:是具有一定功能的一个程序块:是C语言的基本组成单位. 在前面各章的例子及读者自己编写的C语言程序中都用到了以“main“开头的主函数,并且在程序中频繁地调用 ...

  7. Java 诞生的趣事

    ​ Java 命名的由来 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆).NetBeans(网络豆)以及Object ...

  8. ABP开发框架前后端开发系列---(4)Web API调用类的封装和使用

    在前面随笔介绍ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以及简化了ABP框架的各个层的内容,使得我们项目结构更加清晰.上篇随笔已经介绍了字典模块中应用服务层接口的实现情况,并且通过 ...

  9. 【转】如何在Ubuntu 14.04 LTS上设置Nginx虚拟主机

    介绍 转自http://www.pandacademy.com/%E5%A6%82%E4%BD%95%E5%9C%A8ubuntu-14-04-lts%E4%B8%8A%E8%AE%BE%E7%BD% ...

  10. HBase 学习之路(十一)—— Spring/Spring Boot + Mybatis + Phoenix 整合

    一.前言 使用Spring+Mybatis操作Phoenix和操作其他的关系型数据库(如Mysql,Oracle)在配置上是基本相同的,下面会分别给出Spring/Spring Boot 整合步骤,完 ...