.NET Standard 来日苦短去日长

作者:Richard翻译:精致码农-王亮原文:
自从 .NET 5 宣贯以来 , 很多人都在问这对 .NET Standard 意味着什么 , 它是否仍然重要 。 在这篇文章中 , 我将解释 .NET 5 是如何改进代码共用并取代 .NET Standard 的 , 我还将介绍什么情况下你仍然需要 .NET Standard 。
概要.NET 5 将是一个具有统一功能和 API 的单一产品 , 可用于 Windows 桌面应用程序、跨平台移动应用程序、控制台应用程序、云服务和网站 。
.NET Standard 来日苦短去日长文章插图
为了更好地说明这一点 , 我们更新了这篇[1]关于 TFM (Target Framework Names) 介绍的文章(译文:.NET 5 中 Target Framework 详解) , 现支持的 TFM 如下:

  • .net5.0 , 表示代码可在任意平台运行 , 它合并并替换了 netcoreapp 和 netstandard 这两个名称 。 这个 TFM 通常只包括跨平台的技术(除了一些为了满足实用性而作出让步的 API , 就像我们在 .NET Standard 中所做的那样) 。
  • net5.0-windows(还有后面会增加的net6.0-android 和 net6.0-ios) , 这些 TFM 表示 .NET 5 特定于操作系统的风格 , 包含 net5.0 和特定于操作系统的功能 。
我们不会再发布 .NET Standard 的新版本 , 但是 .NET 5 和所有未来的版本将继续支持 .NET Standard 2.1 和更早的版本 。 你应该将 net5.0(和未来的版本)视为共享代码的基础 。
由于 net5.0 是所有这些新 TFM 的共用的基础 , 这意味着运行时、库和新的语言特性都会围绕这个版本号进行协调 。 例如 , 为了使用 C# 9 , 你需要使用 net5.0 或 net5.0-windows 。
如何选择 Target.NET 5 和所有未来的版本将继续支持 .NET Standard 2.1 和更早的版本 , 从 .NET Standard 重新 Target 到 .NET 5 的唯一原因是为了获得更多运行时特性、语言特性或 API 支持 。 所以 , 你可以把 .NET 5 想象成 .NET Standard 的 vNext 。
那新代码呢?该从 .NET Standard 2.0 开始还是直接从 .NET 5 开始?这得视情况而定 。
  • 应用程序组件 , 如果你要将你的应用程序以类库的形式分解成多个组件 , 我建议将 netX.Y 作为 TFM , netX.Y 中的 X.Y 是应用程序(或多个应用程序)的 .NET 最低版本号 。 为了简单起见 , 你可能希望所有组成你的应用程序的 Project 都使用相同的 .NET 版本 , 因为这样可以保证各处的代码都可以使用相同的 BCL 特性 。
  • 可重用库 , 如果你正在构建计划在 NuGet 上发布的可重用库 , 你将需要考虑适用范围和可用新特性之间的权衡 。 .NET Standard 2.0 是 .NET Framework 支持的最高 .NET Standard 版本 , 所以它可以满足你的大部分使用场景 。 我们通常建议不要将 Target 锁定在 .NET Standard 1.x 上 , 因为不值得再为此增添不必要的麻烦 。 如果你不需要支持 .NET Framwork , 那么你可以选择 .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 库的一惯做法——你通常要支持一段时间较老的版本 , 以确保没有升级最新 .NET 版本的用户依然可以使用你的库 。
总结一下: