微软在11月5日发布了 .NET Standard 2.1 ,开发团队计划在 .NET Standard 2.1 中添加大约 3000 个 API ,其中很大一部分都是全新的,另外一部分则是添加到标准中的现有 API ,以便进一步使 .NET 实现一致。
更新亮点:
● Span。在 .NET Core 2.1 中,开发团队添加了一个类似于数组的类型 Span,它允许以统一的方式表示托管和非托管内存,并支持切片而无需复制。它是 .NET Core 2.1 中与性能相关的大多数改进的核心。由于它允许以更有效的方式管理缓冲区,因此可以帮助减少内存分配和复制。Span 被认为是一种非常基础的类型,因为它需要运行时和编译器支持才能充分利用。
● Foundational-APIs working with spans。虽然 Span 已经可以作为 .NET Standard 兼容的 NuGet 包(System.Memor)使用,但添加此包不能扩展 .NET Standard 类型的成员去使用 span。.NET Core 2.1 添加了许多允许使用 span 的API,如 Stream.Read(Span) 。将 span 带入 .Net Standard 的话,添加这些 API 是很重要的一部分。
● Reflection 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。在 .NET Core 2.1 中,最大的亮点是对高性能场景的基础知识的支持改进,其中还包含提高 async/await 效率。ValueTask 已经存在,并且如果操作同步,则允许返回结果,而无需分配新的 Task。在 .NET Core 2.1 中,开发团队进一步对其进行改进,使得有一个相应的非泛型 ValueTask 变得很有用。它允许减少分配内存,即使是在必须异步完成操作的情况下也是如此。在 .NET Standard 2.1 中公开这些 API 将使库作者能够作为消费者和生产者从中受益。
● DbProviderFactories。在 .NET Standard 2.0 中,开发团队在 ADO.NET 中添加了几乎所有的基础类型(Primitives),以允许 ORM 和数据库实现者进行通信。不幸的是,当时 DbProviderFactories 未在其中,新版本已将其补上。简而言之,DbProviderFactories 允许库和应用在编译时使用特定的 ADO.NET 提供程序而无需知道任何特定类型,方法是在基于名称的已注册 DbProviderFactory 实例中进行选择,例如,可以从配置设置中读取。
● General Goodness。自从 .NET Core 开源后,基础类库中已添加许多小功能,例如 System.HashCode 用于组合 hash code 或 System.String 上的新的重载。.NET Core 中大约有800个新成员,且几乎都加入了 .NET Standard 2.1。