.NET 7 來了!!!

.NET 7 首個RC(發佈候選)版本

  最近 .Net 的大事件,就是微軟發佈了.NET 7的首個RC(發佈候選)版本,而據微軟發佈的消息,這是 .NET 7 的最後一個預覽版,下一個版本將是第一個候選版本 (RC),發佈時間定於 2022 年 11 月 8 日至 10。

  .Net 7 適用於 Windows、macOS 與 Linux,已經支持在生產環境上使用(在這裡還是建議小夥伴們穩重一點,先用小項目試試水)。而微軟提供的日誌,顯示,NET 7 RC 1 首次加入雲原生支持,這將使得開發者能夠更加便利的實現應用上雲,或在雲端直接構建並運行應用的操作,理論上大大提升了開發效率、生產效率。

除此之外,.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 簡化排序

dotnet/runtime#67194

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 文件模式

dotnet/runtime PR#69980

  以前,.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);

查看所有新的 Unix 文件模式 API。

非常感謝 @tmds,他是 Red Hat 的長期貢獻者,他提出、設計和實現了這個功能。

低級結構改進:ref 字段支持

  .NET 7 運行時現在完全支持 ByRefLike 類型(即 ref struct)中的 ref 字段。 在這個備受期待的功能背後有廣泛的語言設計,用戶可以閱讀:低級結構改進。 藉助此功能,以前需要在運行時進行專門處理的類型(例如,Span<T> 和 ReadOnlySpan<T>)現在可以在 C# 中完全實現。

LibraryImport P/Invoke 源生成器

dotnet/runtime#60595

  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 升級響應詳細信息

dotnet/runtime#25918

  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 中為異常處理 函數啟用了熱/冷拆分。

原文鏈接://www.cnblogs.com/ysmc/p/16709631.html

Tags:
Exit mobile version