.NET 7 來了!!!

2022-09-20 06:02:18

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

原文連結:https://www.cnblogs.com/ysmc/p/16709631.html