闲聊 .NET Standard

image

前言

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

image

这个神秘的 .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 等视为单一的代码库,通过编译期和运行时的检查来解决不同平台下它们所支持的功能具有差异这一问题。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/38440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】字母异位词分组

题目:字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] …

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

【0300】Postgres内核动态哈希表实现机制(1)

相关文章: 【0299】Postgres内核之哈希表(Hash Tables) 0 概述 在【0299】Postgres内核之哈希表(Hash Tables)一文中,讲解了哈希表的作用、实现、优缺点等特性。本文开始,将详细分析Postgres内…

MySQL之应用层优化(三)

应用层优化 应用层缓存 2.本地共享内存缓存 这种缓存一般是中等大小(几个GB),快速,难以在多台机器间同步。它们对小型的半静态位数据比较合适。例如每个州的城市列表,分片数据存储的分区函数(映射表),或者使用存活时间(TTL)策略…

记录一次Chrome浏览器自动排序ajax请求的JSON数据问题

文章目录 1.前言2. 为什么会这样?3.如何解决? 1.前言 作者作为新人入职的第一天,mentor给了一个维护公司运营平台的小需求,具体需求是根据运营平台的某个管理模块所展示记录的某些字段对展示记录做排序。 第一步: myb…

工业触摸一体机优化MES应用开发流程

工业触摸一体机在现代工业生产中扮演着至关重要的角色,它集成了智能触摸屏和工业计算机的功能,广泛应用于各种生产场景中。而制造执行系统(MES)作为工业生产管理的重要工具,对于提高生产效率、降低成本、优化资源利用具…

力扣hot100-普通数组

文章目录 题目:最大子数组和方法1 动态规划方法2 题目:合并区间题解 题目:最大子数组和 原题链接:最大子数组和 方法1 动态规划 public class T53 {//动态规划public static int maxSubArray(int[] nums) {if (nums.length 0…

C++基础知识-编译相关

记录C语言相关的基础知识 1 C源码到可执行文件的四个阶段 预处理(.i)、编译(.s)、汇编(.obj)、链接。 1.1 预处理 预处理阶段,主要完成宏替换、文件展开、注释删除、条件编译展开、添加行号和文件名标识,输出.i/.ii预处理文件。 宏替换,…

【UML用户指南】-26-对高级行为建模-状态图

目录 1、概念 2、组成结构 3、一般用法 4、常用建模技术 4.1、对反应型对象建模 一个状态图显示了一个状态机。在为对象的生命期建模中 活动图展示的是跨过不同的对象从活动到活动的控制流 状态图展示的是单个对象内从状态到状态的控制流。 在UML中,用状态图…

tcpdump命令详解及使用实例

1、抓所有网卡数据包,保存到指定路径 tcpdump -i any -w /oemdata/123.pcap&一、tcpdump简介 tcpdump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信…

【Python】已解决:SyntaxError: positional argument follows keyword argument

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:SyntaxError: positional argument follows keyword argument 一、分析问题背景 在Python编程中,当我们在调用函数时混合使用位置参数(p…

RabbitMQ进阶篇

文章目录 发送者的可靠性生产者重试机制实现生产者确认 MQ的可靠性数据持久化交换机持久化队列持久化消息持久化 Lazy Queue(可配置~)控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 消费者的可靠性消费者确认机制失败重试机制失败处理策略 业务幂等性唯一消息ID业…

西部智慧健身小程序+华为运动健康服务

1、 应用介绍 西部智慧健身小程序为用户提供一站式全流程科学健身综合服务。用户通过登录微信小程序,可享用健康筛查、运动风险评估、体质检测评估、运动处方推送、个人运动数据监控与评估等公益服务。 2、 体验介绍西部智慧健身小程序华为运动健康服务核心体验如…

idea xml ctrl+/ 注释格式不对齐

处理前 处理后 解决办法 取消这两个勾选

核方法总结(三)———核主成分(kernel PCA)学习笔记

一、核主成分 1.1 和PCA的区别 PCA (主成分分析)对应一个线性高斯模型(参考书的第二章),其基本假设是数据由一个符合正态分布的隐变量通过一个线性映射得到,因此可很好描述符合高斯分布的数据。然而在很多实…

ViewBinding的使用(因为kotlin-android-extensions插件的淘汰)

书籍: 《第一行代码 Android》第三版 开发环境: Android Studio Jellyfish | 2023.3.1 问题: 3.2.4在Activity中使用Toast章节中使用到了kotlin-android-extensions插件,但是该插件已经淘汰,根据网上了解,目前使用了新的技术VewBinding替…

UE4_材质_材质节点_DepthFade

一、DepthFade参数 DepthFade(深度消退)表达式用来隐藏半透明对象与不透明对象相交时出现的不美观接缝。 项目说明属性消退距离(Fade Distance)这是应该发生消退的全局空间距离。未连接 FadeDistance(FadeDistance&a…

【数据分析“三剑客”】—— Pandas

Pandas Pandas 是基于NumPy的一种工具,该工具是为解决数据分析任务而创建的, Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。Pandas与出色的 Jupyter工具包和其他库相结合,Python中用于进行数据分析的环境在性能、生产率和协作能力方面都是…

光照老化试验箱:材料耐久性的“时间加速器”

光照老化试验箱:材料耐久性的“时间加速器”概述 光照老化试验箱是一种模拟自然光照条件下材料老化过程的设备,广泛应用于材料科学领域的耐久性能评估。通过模拟日光中的紫外线、热辐射等环境因素,加速材料老化过程,以此来验证材…

redhawk:tech file与lefdef layer name不匹配问题

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 一些工艺厂商给的redhawk tech file是加密的,读完tech file再读lef/def会报错,根本不知道问题在哪,他们一般会搭配给一个layer map&#xff…