闲聊 .NET Standard

前言

有时候,我们从 Nuget 下载第三方包时,会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外,还会要求 .NET Standard 的版本,比如这样:

这个神秘的 .NET Standard 是什么呢?

.NET Standard 的诞生

在 .NET 的大家庭中有 .NET Framework、.NET Core、Xamarin 等具体的实现,在这些实现中,有一些其他实现所不具有的特性。

比如,.NET Framework 中有访问 Windows 注册表的类,很显然这是其他实现所不具备的;再如,Xamarin 中有拨打电话的类,很显然这也是其他实现所不具备的。

但是这些实现也有一些可以共享的类,比如读写文件的类、List 集合类、字符串类等。如果每个 .NET 实现中,这些可以共享的类都有自己的一套做法,可能就会造成一些问题,比如:

  1. 有可能出现同样功能的类在不同的实现中各不相同的情况,比如在 .NET Framework 中操作文件的类叫 FileStream,但是到了 .NET Core 中对应的类叫 Storage,这样如果我们想开发一个读写文件的代码库供 .NET Framework、.NET Core 等使用,代码编写起来就很麻烦了。

  2. 由于不同的实现中方法名不一致,我们需要花费更多的时间来理解和修改代码,代码会变得难以维护。

  3. 代码可读性就变得更差,代码阅读和理解起来变得很困难。

如果能够这些可以共享的类制定一个规范,无论是 .NET Framework、.NET Core 还是 Xamarin 都要遵守这个规范。比如这个规范规定操作文件的类必须叫 FileStream,而且 FileStream 类必须要有 Read、Write、Flush 等方法,参数和返回值也必须统一,这样编写通用库的时候就会简单很多了。这个 "各个实现通用的基础库规范" 就叫作.NET Standard。

所以,.NET Standard 是一个规范,规定了一系列需要被所有 .NET Core、.NET Framework 及 Xamarin 等共同实现的 API,包括有哪些类、有哪些方法、参数和返回值是什么等。

.NET Standard 和 .NET Core、.NET Framework 对应关系

注意,.NET Standard 只是规定了需要被实现的规范,但是不负责具体实现,对于在 .NET Standard 中规定的类、方法,.NET Core、.NET Framework 及 Xamarin 等必须实现,因此 .NET Standard 相当于定义了 .NET Core、.NET Framework、Xamarin的交集,只要是 .NET Standard 类库,都可以被 .NET Core、.NET Framework、Xamarin 等项目引用。

.NET Standard 随着 .NET 技术的升级而升级,不同版本的 .NET Core、.NET Framework 等支持不同版本的 .NET Standard,越高版本的 .NET Core、.NET Framework 等支持的 .NET Standard 版本越高。

以下是 .NET Standard 和 .NET Core、.NET Framework 对应关系:

  1. .NET Standard 1.0:.NET Core 1.0,.NET Framework 4.5
  2. .NET Standard 1.1:.NET Core 1.0,.NET Framework 4.5
  3. .NET Standard 1.2:.NET Core 1.0,.NET Framework 4.5.1
  4. .NET Standard 1.3:.NET Core 1.0,.NET Framework 4.6
  5. .NET Standard 1.4:.NET Core 1.0,.NET Framework 4.6.1
  6. .NET Standard 1.5:.NET Core 1.0,.NET Framework 4.6.1
  7. .NET Standard 1.6:.NET Core 1.0,.NET Framework 4.6.1
  8. .NET Standard 2.0:.NET Core 2.0,.NET Framework 4.6.1
  9. .NET Standard 2.1:.NET Core 3.0

我们可以开发自己的 .NET Standard 类库吗?

可以。

如果我们要编写一个给公众使用的类库,为了让 .NET Core、.NET Framework 等开发人员都能使用这个类库,那么我们就可以创建自己的 .NET Standard 类库项目。

开发 .NET Standard 类库有个小技巧就是先把项目的 .NET Standard 版本选到最低,如果发现开发时用到的类在这个 .NET Standard 版本中不存在,再逐步在项目属性的 "目标框架" 中提升项目的 .NET Standard 版本,这样有助于提高这个类库的可用范围,因为 .NET Standard 的版本低一些,低版本的 .NET Core、.NET Framework 的项目也能使用这个类库。

最后

.NET Standard 的版本只到 2.1,从 .NET 5 开始,微软不再更新 .NET Standard,而是会把 .NET x 等视为单一的代码库,通过编译期和运行时的检查来解决不同平台下它们所支持的功能具有差异这一问题。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步

相关推荐
小码编匠3 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
Envyᥫᩣ6 小时前
C#语言:从入门到精通
开发语言·c#
IT技术分享社区12 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆19 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風21 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_656974741 天前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo1 天前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo1 天前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发1 天前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf