什么是.NET 6
.NET 6為瀏覽器(Browser
)、雲(Cloud
)、桌面(Desktop
)、物聯網(IOT
)和移動應用程序(Mobile Apps
)提供了一個統一的平台。底層平台已更新,以滿足所有應用程序類型的需求,並使您可以輕松地在所有應用程序中重用代碼。新功能和改進可同時用於所有應用程序,因此您在雲中或移動設備上運行的代碼具有相同的行為方式並具有相同的優勢。
隨着每個版本的發布,.NET開發人員的范圍不斷擴大。機器學習(Machine learning
)和WebAssembly是最近添加的兩個。例如,通過機器學習,您可以編寫應用程序來查找流數據中的異常情況。使用Web Assembly,您可以在瀏覽器中托管.NET應用程序,就像HTML和JavaScript一樣,或者將它們與HTML和JavaScript混合。
最令人興奮的新增功能之一是.NET多平台應用程序UI(.NET MAUI
)。您現在可以在單個項目中編寫代碼,從而提供跨桌面和移動操作系統的現代客戶端應用程序體驗。.NET MAUI將比.NET 6晚一點發布。我們在.NET MAUI上投入了大量時間和精力,很高興能夠發布它並看到.NET MAUI應用程序投入生產。
當然,.NET應用程序也在Windows桌面上(使用Windows Forms和WPF)以及在雲中使用ASP.NET Core。它們是我們提供時間最長的應用程序類型,並且仍然非常受歡迎,我們在.NET 6中對它們進行了改進。
更新內容
- 通過微軟自有服務、其他公司運行的雲應用程序和開源項目進行了生產壓力測試。
- 作為最新的長期支持(LTS)版本,支持三年。
- 跨瀏覽器、雲、桌面、物聯網和移動應用程序的統一平台,所有應用程序都使用相同的.NET庫和輕松共享代碼的能力。
- 性能全面提升,尤其是文件I/O,減少了執行時間、延遲和內存使用。
- C# 10提供了語言改進,例如記錄結構、隱式使用和新的lambda功能,同時編譯器添加了增量源生成器。
- F# 6添加了新功能,包括基於任務的異步、管道調試和眾多性能改進。
- Visual Basic在Visual Studio體驗和Windows Forms項目打開體驗方面進行了改進。
- 熱重載,使用戶可以跳過重新構建和重新啟動應用程序以查看新更改——在Visual Studio 2022和.NET CLI中支持,適用於C#和Visual Basic。
- 雲診斷,已通過OpenTelemetry和Dotnet Monitor得到改進,現在在生產中得到支持,並且可用於Azure應用服務。
- JSON API,更強大,具有更高的性能,帶有序列化程序的源生成器。
- ASP.NET Core中引入了Minimal APIs,以簡化入門體驗並提高HTTP服務的性能。
- Blazor組件現在可以從JavaScript呈現並與現有的基於JavaScript的應用程序集成。
- 用於Blazor WebAssembly(Wasm) 應用程序的WebAssembly AOT編譯,以及對運行時重新鏈接和本機依賴項的支持。
- 使用ASP.NET Core構建的單頁應用程序(Single-page apps) 現在使用更靈活的模式,可以與Angular、React和其他流行的前端JavaScript框架一起使用。
- 添加了HTTP/3,以便ASP.NET Core、HttpClient和gRPC都可以與HTTP/3客戶端和服務器交互。
- File IO,現在支持符號鏈接,並通過重新編寫的
FileStream
大大提高了性能。 - 通過支持OpenSSL 3、ChaCha20Poly1305加密方案和運行時深度防御緩解措施,特別是W^X和CET,安全性得到了提高。
- 可以為Linux、macOS和Windows(以前僅適用於Linux)發布單文件應用程序(免解壓)。
- IL修整(IL trimming) 現在更加強大和有效,新的警告和分析器可確保正確的最終結果。
- 添加了源代碼生成器和分析器(Source generators and analyzers),可幫助用戶生成更好、更安全和更高性能的代碼。
- 源代碼構建(Source build) 使Red Hat等組織能夠從源代碼構建.NET,並向其用戶提供自己的構建版本。
該版本包括大約一萬個git提交。您必須下載並試用.NET 6才能看到所有新內容。
對雲服務的意義
-
體積更小:對於微服務分布式架構而言,更小的體積意味着更少的下載帶寬,更快的分發下載速度,.NET 6的鏡像體積都很小,alpine的鏡像更小,帶上應用程序通常80M。
-
啟動速度更快:對於傳統單體應用,啟動速度與運行效率相比不是一個關鍵的指標。原因是,這些應用重啟和發布頻率相對較低。然而對於需要快速迭代、水平擴展的微服務應用而言,更快的的啟動速度就意味着更高的交付效率,和更加快速的回滾。尤其當你需要發布一個有數百個副本的應用時,緩慢的啟動速度就是時間殺手。對於Serverless應用而言,端到端的冷啟動速度則更為關鍵,即使底層容器技術可以實現百毫秒資源就緒,如果應用無法在500ms內完成啟動,用戶就會感知到訪問延遲。
-
占用資源更少:運行時更低的資源占用,意味着更高的部署密度和更低的計算成本。.NET 6的CLR啟動速度非常快,降低啟動時資源消耗,可以減少資源爭搶,更好保障其他應用SLA。
-
支持水平擴展:.NET 6默認更好的支持Docker資源限制,官方團隊也在努力讓.NET 6成為真正的容器運行時,使其在低內存環境中具有容器感知功能並高效運行。隨着內存成本的下降和虛擬化的流行,大內存配比已經成為趨勢。所以我們一般是采用水平擴展的方式,同時部署多個應用副本,在一個計算節點中可能運行一個應用的多個副本來提升資源利用率。
面向.NET6
繼續以廣泛的平台為主題,在所有這些操作系統上編寫.NET代碼很容易。
要以.NET 6為目標,您需要使用.NET 6目標框架,如下所示:
<TargetFramework>net6.0</TargetFramework>
這個net6.0
Target Framework Moniker(TFM)使您可以訪問.NET提供的所有跨平台API。如果您正在編寫控制台應用程序、ASP.NET Core應用程序或可重用的跨平台庫,這是最佳選擇。
如果您的目標是特定的操作系統(例如編寫Windows Forms或iOS應用程序),那么還有另一組TFM(每個都針對一個不言自明的操作系統)供您使用。它們使您可以訪問net6.0中的所有API以及一堆特定於操作系統的API。
net6.0-android
net6.0-ios
net6.0-maccatalyst
net6.0-tvos
net6.0-windows
每個無版本的TFM都相當於.NET 6以最低支持的操作系統版本為目標。如果您想要特定或訪問更新的API,可以指定操作系統版本。
net6.0
和net6.0-windows
的TFM都是支持的(與.NET 5相同)。Android和Apple的TFM是.NET 6的新增功能,目前處於預覽階段。稍后的.NET 6更新將支持它們。
操作系統特定的TFM之間沒有兼容性關系。例如,net6.0-ios
與net6.0-tvos
不兼容。如果您想共享代碼,您需要使用帶有#if
語句的源代碼或帶有net6.0
目標代碼的二進制文件來實現。
C# v10
歡迎來到C# v10。C# v10的一個主要主題是繼續從C# v9中的頂級語句開始的簡化之旅。新功能從Program.cs
中刪除了更多的儀式,導致程序只有一行。他們的靈感來自與沒有C#經驗的人(學生、專業開發人員和其他人)交談,並學習對他們來說最有效且直觀的方法。
大多數.NETSDK模板都已更新,以提供C# v10現在可以實現的更簡單、更簡潔的體驗。我們聽到反饋說有些人不喜歡新模板,因為它們不是為專家設計的,刪除面向對象,刪除在編寫C#的第一天就需要學習的重要概念,或者鼓勵在一個文件中編寫整個程序。客觀地說,這些觀點都不是真的。新模型同樣適用於學生和專業開發人員。然而,它與我們在.NET6之前擁有的C派生模型不同。
C# v10中還有其他一些功能和改進,包括記錄結構。
全局using指令
全局using指令讓您只需指定一次using
指令,並將其應用於您編譯的每個文件。
以下示例顯示了語法的廣度:
global using System;
global using static System.Console;
global using Env = System.Environment;
您可以將global using
語句放在任何.cs
文件中,包括在Program.cs
中。
隱式using是一個MSBuild概念,它會根據SDK自動添加一組global using
指令。例如,控制台應用隱式使用不同於ASP.NETCore。
隱式使用是選擇加入的,並在PropertyGroup
中啟用:
<ImplicitUsings>enable</ImplicitUsings>
隱式使用是現有項目的選擇加入,但默認情況下包含在新的C#項目中。有關更多信息,請參閱隱式使用。
文件范圍的命名空間
文件范圍的命名空間使您可以為整個文件聲明命名空間,而無需將其余內容嵌套在{ ... }
中。只允許一個,並且它必須出現在聲明任何類型之前。
新語法是一行:
namespace MyNamespace;
class MyClass { ... } // Not indented
這種新語法是三行縮進樣式的替代:
namespace MyNamespace
{
class MyClass { ... } // Everything is indented
}
好處是在整個文件都在同一個命名空間中的極其常見的情況下減少縮進。
記錄結構
C# 9引入了記錄作為類的一種特殊的面向值的形式。在C# v10中,您還可以聲明結構記錄。C#中的結構已經具有值相等性,但記錄結構添加了==
運算符和IEquatable<T>
的實現,以及基於值的ToString
實現:
public record struct Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
就像記錄類一樣,記錄結構可以是“位置”的,這意味着它們有一個主構造函數,它隱式聲明了與參數對應的公共成員:
public record struct Person(string FirstName, string LastName);
但是,與記錄類不同,隱式公共成員是可變的自動實現的屬性。這是因為記錄結構是元組的自然成長故事。例如,如果您有一個(string FirstName, string LastName)
返回類型,並且您希望將其擴展為命名類型,則可以輕松聲明相應的位置結構記錄並維護可變語義。
如果您想要一個具有只讀屬性的不可變記錄,您可以將整個記錄結構聲明為只讀(就像其他結構一樣):
public readonly record struct Person(string FirstName, string LastName);
C# v10還支持表達式,不僅適用於記錄結構,還適用於所有結構以及匿名類型:
var updatedPerson = person with { FirstName = "Mary" };
熱重載
熱重載是另一個性能特性,專注於開發人員的生產力。它使您能夠對正在運行的應用程序進行各種代碼編輯,從而減少您等待應用程序重新構建、重新啟動或重新導航到進行代碼更改后所在位置所需的時間。
熱重載可通過dotnet watch CLI
工具和Visual Studio 2022
使用。您可以將熱重載用於多種應用程序類型,例如ASP.NETCore、Blazor、.NET MAUI、控制台、Windows窗體(WinForms)、WPF、WinUI3、Azure Functions等。
使用CLI時,只需使用dotnet watch
啟動您的.NET 6應用程序,進行任何支持的編輯,並在保存文件時(如在Visual Studio Code中)將立即應用這些更改。如果不支持更改,詳細信息將記錄到命令窗口。
CLI體驗熱重載
此圖像顯示正在使用dotnet watch
啟動的MVC應用程序。我對.cs
和.cshtml
文件(如日志中所報告的)進行了編輯,並且都應用到了代碼中,並在不到半秒的時間內很快地反映在瀏覽器中。
使用Visual Studio 2022時,只需啟動您的應用程序,進行受支持的更改,然后使用新的“熱重載”按鈕(如下圖所示)應用這些更改。您還可以選擇通過同一按鈕上的下拉菜單在保存時應用更改。使用Visual Studio 2022時,熱重載可用於多個.NET版本、.NET5+、.NETCore和.NET Framework。例如,您將能夠對按鈕的OnClickEvent
處理程序進行代碼隱藏更改。應用程序的Main
方法不支持它。
Visual Studio 2022體驗熱重載
注意:RuntimeInformation.FrameworkDescription
中存在一個錯誤,該錯誤在該圖像中顯示,將很快修復。
熱重載還與現有的“編輯並繼續”功能(在斷點處停止時)和XAML熱重載協同工作,用於實時編輯應用程序UI。目前支持C#和Visual Basic應用程序(不是F#)。
Windows Forms
我們繼續對Windows Forms進行關鍵改進。.NET 6包括更好的控件可訪問性、設置應用程序范圍默認字體的能力、模板更新等。
輔助功能改進
在此版本中,我們為CheckedListBox
、LinkLabel
、Panel
、ScrollBar
、TabControl
和TrackBar
添加了UIA提供程序,這些提供程序使講述人等工具和測試自動化能夠與應用程序的元素進行交互。
默認字體
您現在可以使用Application.SetDefaultFont
為應用程序設置默認字體。
void Application.SetDefaultFont(Font font)
最小的應用
以下是使用.NET6的最小Windows Forms應用程序:
class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
作為.NET 6版本的一部分,我們一直在更新大多數模板,使其更加現代和簡約,包括Windows Forms。我們決定讓Windows Forms模板更傳統一些,部分原因是需要將[STAThread]
屬性應用於應用程序入口點。然而,除了立即出現之外,還有更多的玩法。
ApplicationConfiguration.Initialize()
是一個源代碼生成的API,它在幕后發出以下調用:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetDefaultFont(new Font(...));
Application.SetHighDpiMode(HighDpiMode.SystemAware);
這些調用的參數可通過csproj
或props
文件中的MSBuild屬性進行配置。
Visual Studio 2022中的Windows Forms設計器也知道這些屬性(目前它只讀取默認字體),並且可以向您顯示您的應用程序,就像它在運行時一樣:
模板更新
C#的Windows Forms模板已更新,以支持新的應用程序引導程序、全局using指令、文件范圍的命名空間和可為空的引用類型。
更多運行時設計器
現在您可以構建通用設計器(例如,報表設計器),因為.NET6具有設計器和設計器相關基礎結構的所有缺失部分。有關更多信息,請參閱此博客文章。
.NET 6中的中斷性變更
https://docs.microsoft.com/zh-cn/dotnet/core/compatibility/6.0
.NET運行環境檢查工具
安裝.NET運行環境檢查工具
dotnet tool install --global dotnet-runtimeinfo
使用.NET運行環境檢查工具
dotnet runtimeinfo
安裝.NET MAUI(Visual Studio 2022 Preview)
現在要安裝.NET MAUI,您需要確保使用的是今天與穩定版17.0一起發布的Visual Studio 2022(17.1)預覽版。安裝時,您只需要“使用.NET進行移動開發”工作負載,該工作負載默認提供“.NET MAUI(預覽版)”依賴項。在未來的版本中,.NET MAUI將被提升為它自己的頂級工作負載。
就是這樣!不再需要額外的擴展,您就可以開始使用.NET MAUI進行開發了。
控件和功能的更新
此版本中的新增功能是CollectionView
和IndicatorView
的處理程序實現。其他控件也看到了為VerticalTextAlignment
、TextTransform
等實現的屬性。有關更改和改進的完整列表,請參閱發行說明。
CollectionView
涵蓋了大多數與ListView
相同的基於虛擬化列表的場景,並添加了對其他布局(例如水平和網格)的支持。這是一個跨越兩列的垂直滾動網格:
<CollectionView ItemsSource="{Binding Monkeys}"
ItemsLayout="VerticalGrid, 2">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10" RowDefinitions="60" ColumnDefinitions="70,*">
<Image Grid.RowSpan="2"
Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60">
<Image.Clip>
<RectangleGeometry Rect="0,0,160,160"/>
</Image.Clip>
</Image>
<Label Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
TextColor="White"
VerticalOptions="Start"
LineBreakMode="TailTruncation" />
<Label Grid.Column="1"
Text="{Binding Location}"
LineBreakMode="TailTruncation"
FontAttributes="Italic"
TextColor="White"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
改進控件的使用說明文檔
.NET技術社區論壇
.NET是一個統一平台,使開發人員能夠跨操作系統和平台構建世界一流的應用程序。有數百萬開發人員使用.NET構建應用程序並幫助其他開發人員開始使用.NET的全球社區。去年,在討論和獲得技術幫助方面,我們開始了統一.NET社區的旅程。首先,我們推出了Microsoft Q&A for .NET,這是一個提供.NET技術問題和答案的主頁。該中心的訪客、問題和來自社區和Microsoft員工的回答數量逐月大幅增長。我們要感謝大家如此參與問答,這導致每個月有超過80%的問題得到解答!
饋,需要一個空間來進行問答之外的更多互動。您告訴我們,您正在尋找一個專門的論壇,在那里您可以進行技術討論、討論最佳實踐、討論新版本並分享操作指南。這就是為什么我們很高興地宣布所有.NET開發人員主題和討論的.NET技術社區論壇!
技術社區功能
無論您是Web開發人員、移動和桌面開發人員、微服務、數據、機器學習還是剛入門,都有適合您的討論空間!只需加入.NET技術社區,選擇一個討論空間,開始新的討論,並與其他.NET開發人員協作!
關注話題
可以關注.NET技術社區上的每個主題,因此您可以通過電子郵件、RSS源或在您的技術社區主頁上獲取更新。
加入更多社區
.NET技術社區最好的部分是它是整個Microsoft技術社區的一部分。您可以加入、關注和開始討論大量產品和專題社區中心。
建立您的個人資料並獲得成就
誰不喜歡通過幫助社區和討論您最喜歡的話題來獲得成就和榮譽!
新的.NET技術社區將與Microsoft問答並存:
- 適用於.NET的Microsoft問答–為您提供技術問題和支持
- .NET技術社區-用於技術討論、操作方法等。
技術社區和問答的推出有助於與Microsoft面向開發人員的所有產品保持一致,包括Azure、Teams、Office以及您將在這兩個平台上找到的更多產品。
參考
- Announcing .NET 6 — The Fastest .NET Yet
- .NET 6 預覽版發布,Python的跨平台地位受到挑戰
- .NET 生態系統的蛻變之 .NET 6雲原生
- 微軟認真聆聽了開源 .NET 開發社區的炮轟: 通過CLI 支持 Hot Reload 功能
- 微軟 .NET 6 正式發布:C# 10、F# 6、PowerShell 7.2 推出,支持三年
- .NET 6 Release Candidate 1 Ships
- Announcing .NET MAUI Preview 10
- .NET November 2021 Updates – 5.0.12 and 3.1.21
- What’s New for Visual Basic in Visual Studio 2022
- Welcome to C# 10
- Announcing .NET 6 Preview 7
- Announcing ASP.NET Core in .NET 6
- Introducing the .NET Tech Community Forums
- 淺講.Net 6 並與之前版本寫法對比