除此之外,.NET 7 RC 1還帶來了大量更新與優化,具體如下:
-.NET MAUI:.NET多平台應用程序 UI (MAUI) 將 Android、iOS、macOS 和 Windows API 統一到一個API中,開發者可以編寫一個在多平台上本機運行的應用。作為.NET 7的一部分,.NET MAUI提供了一個項目來處理跨設備及其平台的多目標。
-ARM64:.NET可幫助開發者構建在ARM設備上運行的應用,.NET 7將迎來多項改進。
-現代化:為了使升級體驗儘可能無縫,.NET升級助手為開發者提供分步指導體驗,通過分析和改進項目文件、代碼文件和依賴項來現代化.NET應用。
-性能:.NET 7是目前最快的.NET。.NET 7對反射、堆棧替換 (OSR)、啟動時間、本機 AOT、循環優化和許多其他領域進行了超過一千項影響性能的改進。
目前,微軟已經放出了.NET 7 RC 1的鏈接,有需求的用戶可以前往下載,傳送門
而微軟這邊也有相關的博客,感興趣的小夥伴可以去看看,因為是英文的,瀏覽器翻譯出來的懂得都懂,我就不獻醜總結了,硬要說,就是一個字:快!傳送門
.NET 7 最新更新
下面是摘抄的一些資料,希望能讓小夥伴們更加容易了解到 .Net 7
使用 System.LINQ 簡化排序
System.Linq 現在有方法 Order 和 OrderDescending,它們可以根據 T 對 IEnumerable 進行排序。
IQueryable 現在也支持這個。
注意:此更改不會向 System.Linq.Expressions 引入新的語言功能。
用法
以前,您必須通過引用自己的值來調用 OrderBy/OrderByDescending。
var data = new[] { 2, 1, 3 }; var sorted = data.OrderBy(static e => e); var sortedDesc = data.OrderByDescending(static e => e);
現在,您可以編寫為:
var data = new[] { 2, 1, 3 }; var sorted = data.Order(); var sortedDesc = data.OrderByDescending();
支持 Unix 文件模式
以前,.NET沒有對獲取和設置Unix文件權限的內置支持,Unix文件權限控制哪些用戶可以讀、寫和執行文件和目錄。P/Invoking 手動調用系統並不總是那麼容易,因為有些在不同的發行版上以不同的方式公開。 例如,在Ubuntu上你可能需要調用__xstat,在RedHat上調用stat等。 這使得一流的 .NET API 很重要。
在預覽版7 中,我們引入了一個新的枚舉:
public enum UnixFileMode { None, OtherExecute, OtherWrite, OtherRead, GroupExecute, GroupWrite, GroupRead, UserExecute, UserWrite, UserRead, ... }
以及 API File.GetUnixFileMode 和 File.SetUnixFileMode,它們在路徑或句柄(文件描述符)上獲取和設置文件模式。 以及 FileInfo 和 DirectoryInfo 上一個名為 UnixFileMode 的新屬性。
還有一個新的 Directory.CreateDirectory 重載和 FileStreamOptions 上的一個新屬性,允許您一次性創建具有特定模式的目錄或文件。 請注意,當您使用這些時,仍會應用 umask,就像您在 shell 中創建目錄或文件一樣。
用法
// 創建具有特定權限的新目錄 Directory.CreateDirectory("myDirectory", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute); // 創建具有特定權限的新文件 FileStreamOptions options = new() { Access = FileAccess.Write, Mode = FileMode.Create, UnixCreateMode = UnixFileMode.UserRead | UnixFileMode.UserWrite, }; using FileStream myFile = new FileStream("myFile", options); // 獲取現有文件的模式 UnixFileMode mode = File.GetUnixFileMode("myFile"); // 設置現有文件的模式 File.SetUnixFileMode("myFile", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute);
非常感謝 @tmds,他是 Red Hat 的長期貢獻者,他提出、設計和實現了這個功能。
低級結構改進:ref 字段支持
.NET 7 運行時現在完全支持 ByRefLike 類型(即 ref struct)中的 ref 字段。 在這個備受期待的功能背後有廣泛的語言設計,用戶可以閱讀:低級結構改進。 藉助此功能,以前需要在運行時進行專門處理的類型(例如,Span<T> 和 ReadOnlySpan<T>)現在可以在 C# 中完全實現。
LibraryImport P/Invoke 源生成器
LibraryImport 源生成器現在以受支持的方式提供給所有用戶。 超過18個月的努力,這個源生成器被設計成大多數DllImport使用的直接替代品,無論是在運行時產品和用戶代碼中。 .NET 庫都採用了 LibraryImport,並且自 .NET 7 預覽版 1 以來一直附帶源代碼生成的編組代碼。
源代碼生成器隨 .NET 7 TFM 一起提供,可隨時使用。 為了獲得源生成編組的好處,請將 DllImport 的用法替換為 LibraryImport。 有分析器和固定器可以幫助完成這個過程。
用法
前
public static class Native { [DllImport(nameof(Native), CharSet = CharSet.Unicode)] public extern static string ToLower(string str); }
後
public static class Native { [LibraryImport(nameof(Native), StringMarshalling = StringMarshalling.Utf16)] public static partial string ToLower(string str); }
有一個分析器和代碼修復程序可以自動將您的 DllImport 屬性轉換為 LibraryImport。 對於預覽版7,它是可選的。 將 dotnet_diagnostic.SYSLIB1054.severity = suggestion添加到您的 編輯器配置 文件以啟用轉換分析器作為診斷。
有關編組自定義類型的設計文檔和詳細信息可以在 docs/design/libraries/LibraryImportGenerator 找到。
ClientWebSocket 升級響應詳細信息
ClientWebSocket 以前沒有提供有關升級響應的任何詳細信息。 但是,有關響應標頭和狀態代碼的信息在失敗和成功方案中可能都很重要。
在失敗的情況下,狀態碼可以幫助區分可重回和不可重回錯誤(服務器根本不支持 Web 套接字,而只是一個微小的暫時性錯誤)。 標頭還可能包含有關如何處理這種情況的附加信息。
即使在成功的 Web 套接字連接的情況下,標頭也很有幫助,例如,它們可以包含綁定到會話的token、一些與子協議版本相關的信息,或者服務器可能即將關閉等。
用法
ClientWebSocket ws = new(); ws.Options.CollectHttpResponseDetails = true; try { await ws.ConnectAsync(uri, default); // 成功場景 ProcessSuccess(ws.HttpResponseHeaders); ws.HttpResponseHeaders = null; // 清理(如果需要) } catch (WebSocketException) { // 失敗場景 if (ws.HttpStatusCode != null) { ProcessFailure(ws.HttpStatusCode, ws.HttpResponseHeaders); } }
循環優化
在預覽版 7 中,我們對循環優化進行了多項改進。
• PR #71184 加強了對循環表的檢查,以便更好地檢查循環完整性,如 #71084 中所述。
• PR #71868 不要在循環周圍壓縮塊
• PR #71659 在非輪廓方法中調整具有輪廓內循環的塊的權重
• PR #71504 循環提升的改進
• PR #70271 優化多維數組訪問。 它將延遲提高了 67%(性能鏈接)。
此外,在 PR #71236 中為異常處理 函數啟用了熱/冷拆分。