.NET 5.0 亮點整理
15 |
.NET 5 已在 .NET Conf 2020 正式發佈,介紹 .NET 5 新功能前,先溫習 .NET Conf 2019 時提過的 .NET Roadmap,要記住以下幾點:
- 未來 .NET 將固定每年 11 月釋出新版,在 3.1 LTS 之後,雙數版號才是 LTS 版 (Long Term Support,提供長期穩定支援,企業通常會偏好 LTS 版),故 .NET 5.0 非 LTS,明年的 6.0 才是。
- .NET 5.0 是 .NET Core 3.1 的下個版本(而不是 .NET Framework 4.x 的新版),拿掉 Core 字眼,未來會依 .NET 5、6、7、8... 一路發展下去。
- 至於 .NET Framework,4.8 版是最後一版,未來仍會享有技術支援,但不再改版,不會有新發展。
好,回到 .NET 5.0 的新功能新特性,我主要參考這兩篇技術文件:
以下筆記聚焦在我接觸較多的領域(C#、ASP.NET Core),完整內容請自行參考上述文章。
- .NET 5 將不再支援部分 .NET Framework 技術,建議轉移到替代技術。Web Forms 可改為 ASP.NET Core Blazor 或 Razor Pages、WCF 可以 gRPC 取代、WF 則改用 Open-source CoreWF。
- 由於 .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。
- C# 9.0 Record 型別,為 Immutable Reference Type,非常適合用於資料物件,簡化建立、複製操作,新增 with 關鍵字方便以現有物件當樣版改動部分屬性產生新物件。
- C# 9.0 Relational Pattern Matching,支援
public static bool IsLetterOrSeparator(this char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';
這種奇妙寫法。 - 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# 互動式學習 - C# 9.0 支援 IL 低階語法(ldftn, calli),拼效能拼到變態時才會用到。
- Source Generator,允許加入在編譯期間執行的程式,可以偵測現有類別產生額外的輔助類別或工具函式,這類概念透過 Reflection 或注入 IL 也可以實現,Source Genertaor 提前在編譯時處理完畢,提供更簡便效能更好的新選擇。
- 尚在發展中的 System.Text.Json 加入很多新功能
- 新一代的跨平台 (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 釋出正式版。
- 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) ) };
- 與 .NET Framework 4.8、.NET Core 3.1 相比,.NET 5 在效能上又有不少突破,意味即使程式不改,從 .NET Core 3.1 升級 .NET 5 都有機會獲得效能提升。
- Docker Image 瘦身:Ubuntu/Debian 版分別縮小 100MB 及 146MB。
- 支援單一執行檔(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版本再來全面升級。
# by kgame
相較於 2.0 升級 3.1,我覺得3.1升級5.0幾乎無痛 除了OData套件有一堆坑以外,就只做改target成net5.0就沒事了
# by Frank
如果要建立新專案新系統,請問黑大是否採用 .Net 5 開發,或是會採用 .Net Core 3.1 LTS,或是繼續用 .Net Framework ?
# by ChrisTorng
https://www.infoq.cn/article/hsoNZTAIssETJTFjRBXV * 統一了程序員與數據科學家的語言,讓雙方自然對話 * 靜態語言,且語言完全相容 Go * 形式上比 Go 更像腳本,有更低的學習門檻 (和 Python 相當) * 更簡潔的數學運算上的語法支持 (相比 Go) * 雙引擎,既支援靜態編譯為可執行程式,也支持編譯成位元碼方式解譯執行 看了這個 Go+ 語言後,發現結合編譯及解譯式執行的語言是很有潛力的賣點。.NET 程式也有讓 資料科學家 以解譯式逐步執行方式 學習/發掘 數據資料 的潛力嗎???
# by Jeffrey
to Frank, 新專案我會開.NET 5,.NET 6 今年底上市,預期升級工程應該不大。
# by Jeffrey
to ChrisTorng,Go+ 的切入點頗犀利,且看學術界會不會買單,Python 生態體系龐大,換語言必須先過「捨棄既有豐富資源」跟「重學一種新語言」的坎。