.NET Standard 来日苦短去日长

自从 .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 版本的用户依然可以使用你的库。

总结一下:

在 .NET Framework 和所有其他平台之间共享代码,使用 netstandard2.0。

在 Mono、Xamarin 和 .NET Core 3.x 之间共享代码,使用 netstandard2.1。

往后的共享代码,使用 net5.0。

.NET 5 如何解决 .NET Standard 存在的问题

.NET Standard 使得创建适用于所有 .NET 平台的库变得更加容易,但是 .NET Standard 仍然存在三个问题:

它的版本更新很慢[2],这意味着你不能轻松地使用最新的特性。

它需要一个解码环[3]来将版本映射到 .NET 实现。

它公开了特定于平台的特性[4],这意味着你不能静态地验证代码是否真正可移植。

让我们看看 .NET 5 将如何解决这三个问题。

问题 1:.NET Standard 版本更新慢

在设计 .NET Standard[5] 时,.NET 平台还没有在实现层次上融合,这使得编写需要在不同环境下工作的代码变得困难,因为不同的工作代码使用的是不同的 .NET 实现。

.NET Standard 的目标是统一基础类库(BCL)的特性集,这样你就可以编写一个可以在任何地方运行的单一库。这为我们提供了很好的服务:前 1000 个软件包中有超过 77% 支持 .NET Standard。如果我们看看 NuGet.org 上所有在过去 6 个月里更新过的软件包,采用率是 58%。

.NET Standard 来日苦短去日长

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjxsj.html