.NET 5 已在 .NET Conf 2020 正式發佈,介紹 .NET 5 新功能前,先溫習 .NET Conf 2019 時提過的 .NET Roadmap,要記住以下幾點:

  1. 未來 .NET 將固定每年 11 月釋出新版,在 3.1 LTS 之後,雙數版號才是 LTS 版 (Long Term Support,提供長期穩定支援,企業通常會偏好 LTS 版),故 .NET 5.0 非 LTS,明年的 6.0 才是。
  2. .NET 5.0 是 .NET Core 3.1 的下個版本(而不是 .NET Framework 4.x 的新版),拿掉 Core 字眼,未來會依 .NET 5、6、7、8... 一路發展下去。
  3. 至於 .NET Framework,4.8 版是最後一版,未來仍會享有技術支援,但不再改版,不會有新發展。

好,回到 .NET 5.0 的新功能新特性,我主要參考這兩篇技術文件:

以下筆記聚焦在我接觸較多的領域(C#、ASP.NET Core),完整內容請自行參考上述文章。

  1. .NET 5 將不再支援部分 .NET Framework 技術,建議轉移到替代技術。Web Forms 可改為 ASP.NET Core Blazor 或 Razor Pages、WCF 可以 gRPC 取代、WF 則改用 Open-source CoreWF。
  2. 由於 .NET 5.0 成為 .NET 統一標準(不再區分 .NET Core 跟 .NET Framework),故 .NET Standard 不再推新標準,TFM (Target Framework Moniker) net5.0 將取代 netcoreapp 及 netstandard,若要與 .NET Framework 及 .NET Core 共用程式庫,TFM 請用 netstardard 2.0。
  3. C# 9.0 Record 型別,為 Immutable Reference Type,非常適合用於資料物件,簡化建立、複製操作,新增 with 關鍵字方便以現有物件當樣版改動部分屬性產生新物件。
  4. C# 9.0 Relational Pattern Matching,支援 public static bool IsLetterOrSeparator(this char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ','; 這種奇妙寫法。
  5. C# 9.0 Top-Level Statements,省去 void Main(string[] args),一行寫完 Program.cs。(我個人覺得是個雞肋革新,但所有介紹 C# 9.0 的文章都會提)
    [2020-11-18 更新] 感謝 ChrisTorng 補充,此功能乃受 Jupyter Notebook 學習 Python 啟發,方便在 Try.NET 體驗 C# 互動式學習
  6. C# 9.0 支援 IL 低階語法(ldftn, calli),拼效能拼到變態時才會用到。
  7. Source Generator,允許加入在編譯期間執行的程式,可以偵測現有類別產生額外的輔助類別或工具函式,這類概念透過 Reflection 或注入 IL 也可以實現,Source Genertaor 提前在編譯時處理完畢,提供更簡便效能更好的新選擇。
  8. 尚在發展中的 System.Text.Json 加入很多新功能
  9. 新一代的跨平台 (Android、iOS、Linux、macOS、Windows) App 開發平台 - .NET MAUI (Multi-platform App UI),與 Xamarin.Forms 相比,MAUI 以 .NET 6 為基礎,支援 MVVM、RxUI、MVU、Blazor 等模式,僅需單一專案即可支援多種平台。MAUI 目前仍在先期預覽階段 (Early-Preview),預計 2021 11 月隨 .NET 6 釋出正式版。
  10. Model-View-Update Pattern,是種正在興起的 UI 設計方式,採用單向資料流、狀態管理、Code First,藉由只套用必要的改變加速 UI 更新。MAUI 支援 MVVM 及 MVU(還有 Blazor)。MVU 長得像這樣:
    readonly State<int> _count = 0;
    [Body]
    View body() => new StackLayout
    {
        new Label("Welcome to .NET MAUI!"),
        new Button(
            () => $"You clicked {_count} times.",
            () => ++ _count.Value)
        )
    };
    
  11. 與 .NET Framework 4.8、.NET Core 3.1 相比,.NET 5 在效能上又有不少突破,意味即使程式不改,從 .NET Core 3.1 升級 .NET 5 都有機會獲得效能提升。
  12. Docker Image 瘦身:Ubuntu/Debian 版分別縮小 100MB 及 146MB。
  13. 支援單一執行檔(Single-File Apps)部署:從一堆 dll 進化成一個 .exe + .pdb,讓部署作業單純許多,是我期待已久的功能之一。
    [2020-11-18 更新] 感謝「唯」提醒, .NET Core 3.0 時代 即已推出單一檔案部署,但執行前需將內含的程式庫寫到暫存目錄,.NET 5 再優化為直接執行不需產生暫存檔)

Summary of highlights in .NET 5.


Comments

# by 海綿

Blazor page? 黑大是想打 razor page 嗎

# by Jeffrey

to 海綿, 是的,錯字人的日常(鳴...)。謝謝指正。

# by

耶,可以用 is not 惹

# by ChrisTorng

Top-Level Statements 應該是受以 jupyter notebook 學習 Python 的啟發,可在 Try .NET https://dotnet.microsoft.com/platform/try-dotnet https://github.com/dotnet/try https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/hello-world?tutorial-step=1 上以互動方式學習 C# 功能的能力。

# by

另外那個單一執行檔部署,這不是早就支援了嗎? 我 3.1 的時候其他專案就在用了耶

# by Lauyea

我目前專案是使用.NET Core 3.1,黑大會建議全面升級成.NET 5.0嗎? 因為我前陣子大約一個月沒動專案,結果在發布階段發現EF Core產生SQL程式碼出錯,我想大概是版本問題,原本打算全選升到最新版,結果發現現在最新穩定版本已經是5.0了,才又手動選定EF Core for SQL Server到3.1的最新版。開始有被時代拋棄的感覺了XD

# by Ike

6、7、8 的連結都跑去 Top-Level Statements 了

# by Jeffrey

to ChrisTorng,謝謝補充,已加入本文。 to 唯,感謝提醒,已加入本文。 to lke,感謝指正,已更正連結。

# by Jeffrey

to Lauyea,我個人偏好 LTS 版本,加上常抱持 If it works, don't touch it.的鴕鳥心態,有需要 .NET 5 特色功能的專案或基於想練功才會考慮升級。我近年來較保守,要求系統穩定可靠優先於對新技術的追求,因年老體衰,力量值及血量也不足以應付大量改寫升級衍生的例外問題處理,全面升級不是我會採行的策略。以上想法供參。

# by Lauyea

謝謝黑大提供寶貴的意見,那我應該也是先觀望好了,等下一個LTS版本再來全面升級。

Post a comment


97 - 13 =