閑聊 .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.pswp.cn/web/38440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38440.shtml
英文地址,請注明出處:http://en.pswp.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…