當前位置: 妍妍網 > 碼農

.NET 8 中的新增功能

2024-03-18碼農


概述: .NET 8 已釋出,因此是時候開始將計畫移植到新版本了。在本文中,我們將介紹新功能和增強功能:C# 12、效能、本機 AOT、GC、旨在提高效能的新型別、NuGet 稽核等。C# 12中在本文中,我們已經介紹了 C# 12 的新功能。在那裏,我們討論了新的語言功能:主要建構函式、預設參數、集合運算式、行內陣列等。這次沒有太多重大變化。您如何看待此次更新?我們檢視了它,並立即對新的 C# 分析器規則有了一些想法。順便說一句,既然我們談論的是分析儀,我想做一個小公告。我們已經在開發 .NET 8 和 C# 12 支持。我們將在 PVS-Studio 7.28 中介紹它。該版本計劃於 12 月初發

.NET 8 已釋出,因此是時候開始將計畫移植到新版本了。在本文中,我們將介紹新功能和增強功能:C# 12、效能、本機 AOT、GC、旨在提高效能的新型別、NuGet 稽核等。

C# 12中

在本文中,我們已經介紹了 C# 12 的新功能。在那裏,我們討論了新的語言功能:主要建構函式、預設參數、集合運算式、行內陣列等。這次沒有太多重大變化。您如何看待此次更新?我們檢視了它,並立即對新的 C# 分析器規則有了一些想法。

順便說一句,既然我們談論的是分析儀,我想做一個小公告。我們已經在開發 .NET 8 和 C# 12 支持。我們將在 PVS-Studio 7.28 中介紹它。該版本計劃於 12 月初釋出。如果您不想錯過它,我邀請您註冊新聞稿通訊。

效能

Microsoft表示,去年推出的.NET 7非常快,但.NET 8更快。這是真的。Stephen Toub 以他典型的方式在文章中向我們介紹了 .NET 8 的效能改進。它有幾百頁長,涵蓋了大部份(如果不是全部)改進。增強了以下功能:JIT、GC、反射、集合、LINQ、程式碼生成、序列化和反序列化、基後設資料型別等等。

本文重點比較 .NET 7 和 .NET 8 的效能,其中有很多比較表。我想每個人都會在那裏找到一些有趣的東西。因此,您可能需要花一些時間閱讀它。

原生 AOT

簡單提醒一下這項技術是什麽:簡而言之,Native AOT 使用提前編譯器將 IL 編譯為機器碼,同時釋出獨立的應用程式。.NET 8 在 macOS 上添加了對 x64 和 arm64 體系結構的支持。

本機 AOT 應用程式包括 .NET 執行時。因此,它們比常規應用程式更大。.NET 8 也增強了這一方面。下表顯示了 .NET 7 和 .NET 8 的「Hello World」程式的大小:

如您所見,Linux 上的應用程式大小減少了 50%。

此外,.NET 8 開始為類 iOS 平台等平台啟用本機 AOT 支持。請註意,這只是工作的開始。因此,開發人員要求您不要妄下有關效能的結論。現在,您可以在以下平台上使用本機 AOT 生成和執行 .NET iOS 和 .NET MAUI 應用程式: ios iossimulator、maccatalyst tvos tvossimulator

旨在提高效能的新型別

.NET 8 引入了旨在提高不同方案中的套用效能的新型別。開發人員現在擁有 FrozenDictionary<TKey、TValue> FrozenSet<T> 集合,這些集合位於 System.Collections.Frozen 名稱空間中。它們禁止在建立集合後更改鍵和值。這使得它們能夠專門針對讀取操作進行最佳化。這是一個非常方便的功能,當一個集合第一次被填充並儲存了很長時間時。下面是如何使用該集合的範例:

privatestaticreadonlyFrozenDictionary<string,bool> _settings =
GetSettings().ToFrozenDictionary();
....
if (_settings.TryGetValue(key, outbool setting))
{
//....
}

引入了新的 SearchValues<T> 型別。它提供了一組不可變的唯讀值,這些值針對高效搜尋進行了最佳化。

引入了另一種新型別 CompositeFormat ,專門用於在編譯時格式字串未知的情況。例如,從資源載入格式字串時。

最後,還有新的 XxHash3 和 XxHash128 型別實作了快速哈希演算法——XXH3 和 XXH128

NuGet 稽核

安全性在開發過程中起著重要作用,.NET 開發人員始終牢記這一點。現在,在執行 dotnet add 和 _dotnet restore 時,_你將收到有關包含漏洞的每個包的警告。

順便說一句,PVS-Studio 可以搜尋計畫中使用的易受攻擊的元件。如果您使用的庫包含易受攻擊的庫,分析器將發出警告。分析器不僅搜尋直接依賴關系,還搜尋傳遞依賴關系。要了解有關 PVS-Studio 作為 SCA 解決方案的更多資訊,請點選連結。

隨機

添加了處理隨機性的新方法:

  • Random.GetItems

  • RandomNumberGenerator.GetItems

  • 隨機.隨機

  • RandomNumberGenerator.Shuffle

  • GetItems 方法有助於從傳遞的集合中隨機選擇指定數量的項。 Shuffle 方法對傳遞的項序列進行隨機排序。

    正如開發人員所說,這些功能將在機器學習領域派上用場。

    垃圾回收

    從 .NET 8 開始,可以調節記憶體限制。此功能可能對雲服務有用。例如,您可以在負載較低時減少可用記憶體量。若要調整限制,請呼叫 RefreshMemoryLimit 方法。

    現在,您還可以更新某些 GC 配置設定。例如,可以為堆大小設定硬性限制:

    AppContext.SetData("GCHeapHardLimit", _memoryLimit);
    GC.RefreshMemoryLimit();

    System.Text.Json 增強功能

    隨著新 .NET 的釋出,序列化和反序列化得到了很大的改善。有很多增強功能,我將重點介紹最重要的增強功能。

    所以,他們來了:

  • 提高效能;

  • 減小了使用 System.Text.Json 的本機 AOT 應用程式的大小;

  • 源生成器現在支持使用 required init 成員序列化型別。這兩者都已經在基於反射的序列化中得到支持;

  • 增加了介面階層支持;

  • 擴充套件了 JsonSourceGenerationOptionsAttribute 功能;

  • 添加了禁用基於反射的序列化的選項,該序列化預設啟用。

  • 您可以閱讀以下文章,了解有關新功能、bug 修復等的詳細資訊:「.NET 8 中 System.Text.Json 中的新增功能」。

    結論

    回顧 .NET 7 中添加的功能,.NET 8 中似乎沒有什麽新東西。

    但是,我可以向您保證,仍然有很多增強功能。似乎這一次開發人員更專註於對平台的有針對性的改進。在 .NET 使用的許多領域中,有許多不太大但仍然重要的增強功能。

    如果你喜歡我的文章,請給我一個贊!謝謝