.NET Standard停止更新,它将何去何从?

自从.NET 5 发布以来,许多人都在问它对.NET Standard 意味着什么,想知道它是不是还能吸引主流开发人员的兴趣 。
在本文中,我将介绍.NET 5 是如何改善代码共享并替代.NET Standard 的 。同时,我还将介绍一些仍然需要.NET Standard 的情况 。
TL;DR.NET 5 将是一个具有一组统一特性和 API 的单一产品,可用于 windows 桌面应用、跨平台移动应用、控制台应用、云服务和网站 。
为更好地反映这一点,我们更新了目标框架名称(TFM):

  • net5.0 。这适用于运行在所有平台上的代码 。它合并并替换了netcoreApp和netstandard名称 。这个 TFM 总体上只包括跨平台工作的技术(除了一些特例,就像我们在.NET Standard 中所做的那样) 。
  • net5.0-windows(以及之后的net6.0-Android和net6.0-IOS) 。这些 TFM 代表特定于 OS 的.NET 5 风味,其中包括net5.0加上特定于 OS 的特性 。
我们不会再发布.NET Standard 的新版本了,但是.NET 5 和所有将来的版本都会继续支持.NET Standard 2.1 和更早版本 。你应该将net5.0(及以后的版本)视为未来共享代码的基础 。
由于net5.0是所有这些新 TFM 的共享基础,因此这意味着运行时、库和新的语言特性将围绕这个版本号来运作 。例如,为了使用 C# 9,你需要使用net5.0或net5.0-windows 。
你的目标应该是什么.NET 5 和将来所有的版本都会一直支持.NET Standard 2.1 和更早版本 。从.NET Standard 目标切换到.NET 5 的唯一理由是可以访问更多的运行时特性、语言特性或 API 。因此,你可以将.NET 5 视为.NET Standard 的 vNext 。
新代码呢?你还是应该从.NET Standard 2.0 开始还是应该直接进入.NET 5?这要看具体情况 。
  • 应用组件 。如果你使用库将应用程序分解为多个组件,我的建议是使用netX.Y,其中X.Y是应用程序(或多个应用程序)目标的最低.NET 。为简单起见,你可能希望组成应用程序的所有项目都位于同一版本的.NET 上,因为这样以来,你就可以在所有地方都获得相同的 BCL 特性 。
  • 可重用的库 。如果你要构建计划在 NuGet 上发布的可重用库,则需要考虑覆盖率和可用特性集之间的权衡 。.NET Standard 2.0 是.NET Framework 支持的.NET Standard 的最高版本,因此它将为你提供最大的覆盖范围,同时还为你提供了相当大的特性集 。我们通常建议你不要以.NET Standard 1.x 为目标,因为麻烦事太多了 。如果你不需要支持.NET Framework,则可以使用.NET Standard 2.1 或.NET 5 。大多数代码都可以跳过.NET Standard 2.1,直接转到.NET 5 。
那到底该怎么办?我的建议是,广泛使用的库最终将同时将.NET Standard 2.0 和.NET 5 作为目标:支持.NET Standard 2.0 可为你提供最大的支持范围,而支持.NET 5 可确保你能为客户提供.NET 5 上最新的平台特性 。
在几年内,可重用库的选项仅涉及netX.Y的版本号,这基本上就是为.NET 构建库的标准途径——通常来说,你会希望支持某些较旧的版本,以确保获得最大的采用率 。
总结一下:
  • 使用netstandard 2.0在.NET Framework 和其他所有平台之间共享代码 。
  • 使用netstandard 2.1在 Mono、Xamarin 和.NET Core 3.x 之间共享代码 。
  • 使用net5.0为将来的项目进行代码共享 。
.NET 5 如何解决.NET Standard 存在的问题.NET Standard 让开发人员可轻松创建适用于所有.NET 平台的库 。但是,.NET Standard 仍然存在三个问题:
  1. 它的版本更替很慢,这意味着你无法轻松使用最新特性 。
  2. 它需要一个解码器环才能将版本映射到.NET 实现 。
  3. 它公开了特定于平台的特性,这意味着你无法静态验证代码是否真正可移植 。
让我们看看.NET 5 是如何解决这三个问题的 。
问题 1:.NET Standard 版本更新缓慢.NET Standard 是.NET 平台尚未在实现级别融合的时候设计的 。这使开发人员很难编写需要在不同环境中运行的代码,因为不同的负载使用了不同的.NET 实现 。
.NET Standard 的目标是统一基类库(BCL)的特性集,以便你可以编写可在任何地方运行的库 。这对我们很有帮助:.NET Standard 在前 1000 个软件包中得到了 77%以上的支持 。而且,如果我们查看 NuGet.org 上最近 6 个月中更新的所有软件包,则采用率是 58% 。
支持.NET Standard 的包:
.NET Standard停止更新,它将何去何从?

文章插图
 
但是单独标准化 API 集会有代价 。每当我们添加新的 API 时都需要协调 。.NET 开源社区(包括.NET 团队)通过提供新的语言特性、可用性改进、新的跨领域特性(例如Span<T>)或支持新的数据格式或网络协议,以在 BCL 中不断创新前进 。


推荐阅读