3.3 .NET Standard 2.1
.NET Standard 2.1中添加了大约3000个API,其中很大一部分是全新的,而其他部分则是把现有的API添加到Standard中,以便进一步使.NET实现一致。
●Span<T>。在.NET Core 2.1中,开发团队添加了一个类似于数组的类型Span<T>,它允许以统一的方式表示托管和非托管内存,并支持切片而无须复制。它是.NET Core 2.1中与性能相关的大多数改进的核心。由于它允许以更有效的方式管理缓冲区,因此可以有效减少内存分配和复制。Span<T>被认为是一种非常基础的类型,因为它需要运行时和编译器支持才能被使用。
●使用span的基础API。虽然Span已经可以作为.NET Standard兼容的NuGet包(System.Memor)使用,但添加此包并不能让.NET Standard类型的成员使用span。.NET Core 2.1添加了许多允许使用span的API,如Stream.Read(Span)等。在将span带入.Net Standard时,添加这些API是很有必要的。
●反射emit。为了提高生产力,.NET生态系统一直大量使用动态功能,如reflection(反射)和reflection emit。emit通常被用作优化性能,以及为代理接口动态生成类型的方法。因此,许多人要求将reflection emit包含在.NET standard中。以前,开发团队试图通过NuGet包提供,结果发现无法使用包来模拟这样的核心技术。使用.NET Standard 2.1,可以访问轻量级代码生成(LCG)和reflection emit,同时添加了两个新的API,允许检查生成代码的能力(RuntimeFeature.IsDynamicCodeSupported),以及生成的代码是否被解释或编译(RuntimeFeature.IsDynamicCodeCompiled)。
●SIMD。.NET Framework和.NET Core支持SIMD已经有一段时间了,多被用于加速BCL中的基本操作,例如字符串比较。开发团队收到了很多在.NET Standard中公开这些API的请求,因为这些功能需要运行时支持,因此无法作为NuGet包提供。
●ValueTask和ValueTask<T>。ValueTask已经存在,如果操作同步,则允许返回结果,而无须分配新的Task。在.NET Core 2.1中,开发团队进一步对其进行了改进,使得有一个相应的非泛型ValueTask变得很有用。它允许减少分配内存,即使在必须异步完成操作的情况下也是如此。在.NET Standard 2.1中公开这些API将使库作者能够作为消费者和生产者从中受益。
●DbProviderFactories。在.NET Standard 2.0中,开发团队在ADO.NET中添加了几乎所有的基础类型(Primitives),以允许ORM和数据库Provider进行通信。不过,当时DbProviderFactories未在其中,新版本已将其补上。简单来说,DbProviderFactories允许库和应用在编译时使用特定的ADO.NET提供程序而无须知道类型,方法是在基于名称的已注册DbProviderFactory实例中进行选择,例如,可以从配置设置中读取。
●General Goodness。自从.NET Core开源后,基础类库中已添加许多小功能。例如,System.HashCode用于组合hash code或System.String上新的重载。.NET Core中大约有800个新成员,几乎都加入了.NET Standard 2.1。
鉴于.NET Standard 2.1中添加的许多API需要修改运行时才能有意义,.NET Framework 4.8将停留在.NET Standard 2.0上,而不是实现.NET Standard 2.1。.NET Core 3.0、.NET 5、.NET6和即将推出的Xamarin、Mono和Unity版本将更新以实现.NET Standard 2.1。