微軟在去年發布.NET Standard 2.0,約一年的時間再次更新並釋出.NET Standard 2.1,這期間已經發布了.NET Core 2.1兩個版本,接下來即將時出.NET Core 2.2。微軟現在對.NET Standard進行更新,預計新增三千個API,其中一大部分是全新的API,另一部分則是增加原有的API範圍,以進一步匯總.NET的實作。

這次的更新不只是對原本語法進行更新,同時也加入了一些新概念。.NET Standard 2.1現支援Span <T>,而在.NET Core 2.1中,微軟早為其新增了Span <T>,這是一個類似陣列的類型,允許以統一的方式表達管理與非管理記憶體,並支援無複製切片。新增Span <T>與多數.NET Core 2.1的效能提升有關,因為該功能讓管理緩衝區變得更加有效率,並且也幫助減少記憶體配置以及複製,微軟認為,Span <T>是一種非常基礎的類別,因為需要Runtime和編譯器支援才能充分使用。

為了提高生產力,.NET生態系統一直使用大量的動態功能,包括Reflection以及Reflection Emit。Emit通常作為最佳化效能的工具,以及為代理介面動態生成類型的方法,而這樣的方便性讓不少開發者要求微軟在.NET Standard中加入Reflection Emit。過去曾透過NuGet套件這樣的功能,但是微軟後來發現,套件難以模擬這種核心技術,因此在.NET Standard 2.1中正式支援,開發者可以使用輕量級程式碼生成(Lightweight Code Generation,LCG)以及Reflection Emit。

再來.NET Standard 2.1重要的更新便是增加支援SIMD,在.NET Framework和.NET Core都已經支援SIMD一段時間了,微軟利用SIMD來加速BCL中的基本運算,像是字串比較等功能。跟Reflection Emit功能一樣,有不少開發者要求微軟在.NET Standard中公開這些API,畢竟這些功能需要Runtime支援,因此無法光以NuGet套件提供。

微軟還為.NET Standard 2.1新增了ValueTask和ValueTask <T>。在.NET Core 2.1中,最大的基礎改進便是支援高效能情境,包括讓async/await更加有效率。ValueTask<T>原本就已經存在,當操作同步完成,不需要分配新的Task<T>就能回傳結果,在.NET Core 2.1中,微軟進一步改進了這點,這使得相對應非通用ValueTask變得很有用,對於必須要非同步完成操作的情況,也能減少記憶體使用,這是類似於Socket和NetworkStream的功能。微軟現在於.NET Standard 2.1中公開這些API,供函式庫開發者可以方便使用。

在.NET Standard 2.0中,微軟在ADO.NET中添加了很多原語(Primitive),讓O/R映射器和資料庫實作可以在進行通訊,但是DbProviderFactories被漏掉了,現在微軟在.NET Standard 2.1中補上。簡單來說,DbProviderFactories允許函式庫和應用程式在編譯時,使用特定的ADO.NET提供程式,能夠基於名稱選擇已註冊的DbProviderFactory實體,而不需要知道任何特定類型。

微軟提到,.NET Standard 1.x和2.0版本專注於公開現有的概念,大部分的工作都還是在.NET Core方面進行,因為.NET Core提供較小的API集合。


Advertisement

更多 iThome相關內容