官术网_书友最值得收藏!

3.3 .NET Standard 2.1

.NET Standard 2.1中添加了大約3000個API,其中很大一部分是全新的,而其他部分則是把現有的API添加到Standard中,以便進一步使.NET實現一致。

●Span<T>。在.NET Core 2.1中,開發團隊添加了一個類似于數組的類型Span<T>,它允許以統一的方式表示托管和非托管內存,并支持切片而無須復制。它是.NET Core 2.1中與性能相關的大多數改進的核心。由于它允許以更有效的方式管理緩沖區,因此可以有效減少內存分配和復制。Span<T>被認為是一種非常基礎的類型,因為它需要運行時和編譯器支持才能被使用。

●使用span的基礎API。雖然Span已經可以作為.NET Standard兼容的NuGet包(System.Memor)使用,但添加此包并不能讓.NET Standard類型的成員使用span。.NET Core 2.1添加了許多允許使用span的API,如Stream.Read(Span)等。在將span帶入.Net Standard時,添加這些API是很有必要的。

●反射emit。為了提高生產力,.NET生態系統一直大量使用動態功能,如reflection(反射)和reflection emit。emit通常被用作優化性能,以及為代理接口動態生成類型的方法。因此,許多人要求將reflection emit包含在.NET standard中。以前,開發團隊試圖通過NuGet包提供,結果發現無法使用包來模擬這樣的核心技術。使用.NET Standard 2.1,可以訪問輕量級代碼生成(LCG)和reflection emit,同時添加了兩個新的API,允許檢查生成代碼的能力(RuntimeFeature.IsDynamicCodeSupported),以及生成的代碼是否被解釋或編譯(RuntimeFeature.IsDynamicCodeCompiled)。

●SIMD。.NET Framework和.NET Core支持SIMD已經有一段時間了,多被用于加速BCL中的基本操作,例如字符串比較。開發團隊收到了很多在.NET Standard中公開這些API的請求,因為這些功能需要運行時支持,因此無法作為NuGet包提供。

●ValueTask和ValueTask<T>。ValueTask已經存在,如果操作同步,則允許返回結果,而無須分配新的Task。在.NET Core 2.1中,開發團隊進一步對其進行了改進,使得有一個相應的非泛型ValueTask變得很有用。它允許減少分配內存,即使在必須異步完成操作的情況下也是如此。在.NET Standard 2.1中公開這些API將使庫作者能夠作為消費者和生產者從中受益。

●DbProviderFactories。在.NET Standard 2.0中,開發團隊在ADO.NET中添加了幾乎所有的基礎類型(Primitives),以允許ORM和數據庫Provider進行通信。不過,當時DbProviderFactories未在其中,新版本已將其補上。簡單來說,DbProviderFactories允許庫和應用在編譯時使用特定的ADO.NET提供程序而無須知道類型,方法是在基于名稱的已注冊DbProviderFactory實例中進行選擇,例如,可以從配置設置中讀取。

●General Goodness。自從.NET Core開源后,基礎類庫中已添加許多小功能。例如,System.HashCode用于組合hash code或System.String上新的重載。.NET Core中大約有800個新成員,幾乎都加入了.NET Standard 2.1。

鑒于.NET Standard 2.1中添加的許多API需要修改運行時才能有意義,.NET Framework 4.8將停留在.NET Standard 2.0上,而不是實現.NET Standard 2.1。.NET Core 3.0、.NET 5、.NET6和即將推出的Xamarin、Mono和Unity版本將更新以實現.NET Standard 2.1。

主站蜘蛛池模板: 繁峙县| 霞浦县| 安国市| 罗田县| 安丘市| 曲阜市| 荥阳市| 古田县| 佛教| 东乡族自治县| 富平县| 平顶山市| 灵台县| 江安县| 宁陵县| 和林格尔县| 依安县| 会东县| 玛沁县| 安多县| 诏安县| 两当县| 象州县| 黎城县| 开化县| 革吉县| 永嘉县| 辉县市| 拉孜县| 视频| 绥滨县| 荆门市| 犍为县| 汝阳县| 电白县| 定安县| 定结县| 内江市| 遵义县| 阿坝县| 德令哈市|