.NET Conf 2022 在昨晚(11?8?) 11 點 正式開始了,為期三天的會議(11?8-10?), 圍繞 .NET 7 展開。相信各位?伙伴都已經開始安裝 .NET 7 正式版本還有以及相關的開發?具。這次 .NET 7 圍繞傳統的 C# ,ASP.NET Core , Blazor , .NET MAUI , 云原?等內容進行了更新。下面歸類總結?下我比較關心的更新內容,希望能給各位?伙伴?個快速的介紹。
1
C# 11 新增的六大功能
1. 泛型屬性 - Generic attributes
泛型是編程語?的一種風格。讓程序員在強類型程序設計語?中編寫代碼使??些以后才指定的類型。C# 在2.0 開始?持泛型,C# 版本更替時不斷對泛型的?持進?了增強和補充。在 C# 11 中,增加了泛型屬性。
這是?段 ASP.NET 的代碼,每個字段都有?些要求屬性,如必填的字段,限制范圍,以及對應的類型等
public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; } = null!;
[ClassicMovie(1960)]
[DataType(DataType.Date)]
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; } = null!;
[Range(0, 999.99)]
public decimal Price { get; set; }
public Genre Genre { get; set; }
public bool Preorder { get; set; }
}
你可以通過 System.Attribute 派?出不同的屬性。
在 C# 11 之前你也可以去做泛型屬性的定義,通過 System.Type 在?定義屬性類中作為構造函數的參數進?傳遞。
[AttributeUsage(AttributeTargets.Class)]
public class Conditions: Attribute
{
public Conditions(Type t)
{
ParamType = t;
}
public Type ParamType { get; }
}
實現
[Conditions(typeof(string))]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}
? C# 11 增加了對泛型屬性的支持。直接定義?個泛型類,不?再將 System.Type 作為參數傳遞給構造函數。而且可以有?個或者多個類型作為參數, ?且類型安全性也增加了。
[AttributeUsage(AttributeTargets.Class)]
public class Conditions<T>: Attribute
where T : class
{
public Conditions()
{
}
public T ParamType { get; }
}
[Conditions<string>()]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}
因為有了泛型類的加持,您可以在類型參數上靈活添加不同的條件約束。
2. 原始字符串 - New Raw string literals
在定義字符串時,我們往往夾雜著很多的符號,換?還有空格,但過往這些都需要增加轉移字符,但現在通過原始字符串可以讓字符串定義更為簡單,也更容易給?接受。
string?longMessage?=?"""This is a long message.It has several lines.Some are indentedmore than others.Some should start at the first column.Some have "quoted text" in them.""";
3. 列表模式 - List patterns
從 C# 11 開始,可以將數組或列表與模式的序列進?匹配,如以下示例所示:
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers is [1, 2, 3]); // True
Console.WriteLine(numbers is [1, 2, 4]); // False
Console.WriteLine(numbers is [1, 2, 3, 4]); // False
Console.WriteLine(numbers is [0 or 1, <= 2, >= 3]); // True
這個雖然看似是語法糖,但是對于?些數據處理的場景時?常有?的,例如 CSV或者事固定?度的?件數。
4. 字符串插值中的換?符 - Newlines in string interpolations
以前,字符串插值 {text} 的?本只允許??。現在在 C# 11 中,此?本可以允許多?。$ 特殊字符將字符串?本標識為內插字符串 。內插字符串是可能包含內插表達式的字符串?本 。將內插字符串解析為結果字符串時,帶有內插表達式的項會替換為表達式結果的字符串表示形式。
string message = $"The usage policy for {safetyScore} is {safetyScore switch{> 90 => "Unlimited usage",> 80 => "General usage, with daily safety check",> 70 => "Issues must be addressed within 1 week",> 50 => "Issues must be addressed within 1 day",_ => "Issues must be addressed before continued use",}}";
5. 改進方法組轉換為委托 - Method Group conversion to Delegate
委托?于將?法作為參數傳遞給其他?法。最常見的委托是 Action、Func 和 EventHandler。您可以使?lambda 表達式來提供委托,也可以使??法組。您還可以將委托緩存到?個字段中,并在需要時重?該實例。
例如這個就是我們經常使?的定義
void ActionDelegetDemo(Func<string> action) { }
string GetPlayer() => "";
在 C# 11 之前 我們通過方法組進行委托的調用,如
ActionDelegetDemo(GetPlayer);
ActionDelegetDemo(new Func<string>(GetPlayer));
在 C# 11 后,你可以通過沒有閉包的 Lamda / ?法中去實現
ActionDelegetDemo(()?=>?GetPlayer());
也可以通過?動委托的?式來實現
static?readonly?Func<string>?Instance?=?new?Func<string>(GetPlayer);
ActionDelegetDemo(Instance);
6. 接口中的靜態抽象成員 - Static Abstract Members in Interfaces
C# 11 和 .NET 7 包括接?中的靜態抽象成員。它可定義重載運算符或其他靜態成員的接?。使?靜態成員定義接口后,可使?這些接?作為約束來創建使?運算符或其他靜態?法的泛型類型。通過將 static 和abstract 修飾符添加到不提供實現的任何靜態成員,如
public interface IGetNext<T> where T : IGetNext<T>
{
static abstract T operator ++(T other);
}
這個功能在泛型處理是?常?便的,我們可以在接?中包含靜態抽象成員,然后我們可以對泛型?法指定?個約束,即類型參數應該從這個特定的接?派?。?旦完成,泛型?法就可以輕松調?靜態?法。
2
Native AOT 來了
如果你是傳統的 Xamarin 開發者,你肯定對 AOT 技術不陌生,因為有 Mono AOT , ?針對客戶端場景和服務器場景也有 ReadyToRun。Native AOT 技術可以將 .NET 應?程序編譯成本機可執??件 ,也還可以?成獨?的動態或靜態庫從?給其他編程語?調?。Native AOT 應?程序啟動速度?常快,?且對于內存的使?也是?常?的。你可以在沒有 .NET 運?時的設備上直接運? Native AOT 的應?。Native AOT不使用 JIT 編譯器,所以它可以在 JIT 受限制的環境中運?。它可以在 Arm64 / x64 的環境下運?。這個或者讓?家想到了 Rust ,也想到了 Go。現階段,.NET 7 的 Native AOT ?常受限只有控制臺和?些庫文件?持。但這是第一步,希望各位?伙伴也能盡量去嘗試。
如果你要創建?個 Native AOT 的應?,需要在 csproj ?件中添加:
<PropertyGroup><PublishAot>true</PublishAot>
</PropertyGroup>
你也可以針對 Linux 或者 Windows arm / x64 編譯 Native AOT 應?,例如
dotnet?publish?-r?linux-arm64?-c?Release
注意在 Ubuntu 環境下 , 你需要添加以下的?些庫 clang zlib1g-dev
sudo?apt-get?install?clang?zlib1g-de
現在 Native AOT 還是?較受限,我更期待能?持?下 MAUI , 這樣是不是路更?。還有我使? Native AOT編譯出來的應?過?,是否需要考慮壓縮?下呢 ?我能理解它是增量的,但是?個 HelloWorld 應?也?得有點夸張了。希望它能越來越好。
3
端技術改進
.NET MAUI 是?道坎,或者很多?伙伴希望它能做更多。有?會希望性能有所提升,有?希望能在 Linux 上得到?持,也有?希望 IDE 能夠完善?點。我?直和 .NET MAUI 的團隊保持溝通,也希望盡快能實現各位?伙伴的愿望。在 .NET 7 中,.NET MAUI 在桌?應?的?持有了很多的改善。在?勢,在桌?菜單,以及對?標?持,右鍵菜單,窗體縮放都有很好的?持。或者期望更多了。這不是最好的更新,但是這是更穩定的跨平臺應?開發。我們在期待更?更新的時候,更應該開始著?投?到 .NET MAUI 的應?開發中來了,
開發體驗上 .NET MAUI 已經?持 iOS 16 和 Android 13 了, 這也解決了 Xcode 14 不兼容的問題。與時俱進是我喜歡 .NET MAUI 的原因。還有 Hot Reload 也有了?個進化,?持 .NET for iOS 和 .NET for Android 以及Blazor WebAssembly 了。
說完 .NET MAUI , 說到端應?不能不提及 Blazor . 這?年 Blazor 的應?持續攀升,這也得益于一個好的性能以及 WebAssembly 技術 的發展。我個?很喜歡WebAssembly。.NET 7 為基于 JavaScript 的應?中的WebAssembly 上運? .NET 提供了改進的支持,包括豐富的 JavaScript 互操作機制。.NET 7 中的WebAssembly ?持是基于 Blazor WebAssembly 應?程序,但也可以獨?于 Blazor 使?。現有的JavaScript 應?程序可以使? .NET 7 中擴展的 WebAssembly ?持來重? JavaScript 中的 .NET 庫或構建全新的基于 .NET 的應?。Blazor WebAssembly 應?程序還可以使?新的 JavaScript 互操作機制來優化與JavaScript 和 Web 平臺的交互。
各位?伙伴在安裝好 .NET 7 后可以在命令?中通過 workload 添加 wasm 的?持
dotnet workload install wasm-tools
dotnet workload install wasm-experimental
添加完成后,你就可以通過創建你的 wasm 應?
dotnet new wasmbrowser
還有也有了 AOT 的?持,通過 AOT 你可以提升運?速度,通過修改 csproj ?件就可以獲取 AOT ?持
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net7.0</TargetFramework><WasmMainJSPath>main.js</WasmMainJSPath><OutputType>Exe</OutputType><Nullable>enable</Nullable><AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <PublishTrimmed>true</PublishTrimmed>
+ <TrimMode>full</TrimMode>
+ <RunAOTCompilation>true</RunAOTCompilation></PropertyGroup>
</Project>
發布也?常簡單
dotnet publish -c Release
?且還?持在本地托管發布應?
dotnet tool install --global dotnet-serve
dotnet serve --mime .wasm=application/wasm --mime .js=text/javascript --
mime .json=application/json --directory bin\Release\net7.0\browserwasm\
AppBundle\
4
ML.NET 2.0 發布
? .NET 做機器學習,很多?會打?個問號。但微軟就是要把 .NET 可以做機器學習的問號變成了嘆號。ML.NET 在 1.5 后,特別是 ML.NET CLI 已經?常好?,特別是AutoML 這塊。在 ML.NET 2.0 對于?然語?這塊的處理都有?常?的改進。這得益于 TorchSharp 的改進。或者是受TensorFlow.NET 的影響, ?家?持的 TorchSharp 也有了很?的進步。
?然語?是?常常?的問題, ML.NET 新增加了?本分類的 API ,讓開發者通過少量的代碼就可以完成?本分類,情感分析,以及摘要提取等?作。具體的 API 封裝如下
你可以理解為 ML.NET 幫你完成了 80% 的?作,包括最復雜的?然語?算法構建等?作,你需要做的就是提供數據, 和相關 API 的調?。這是官?的?個示例
using Microsoft.ML;
using Microsoft.ML.TorchSharp;
var mlContext = new MLContext();
var reviews = new[]
{
new {Text = "This is a bad steak", Sentiment = "Negative"},
new {Text = "I really like this restaurant", Sentiment = "Positive"}
};
var reviewsDV = mlContext.Data.LoadFromEnumerable(reviews);
var pipeline =
mlContext.Transforms.Conversion.MapValueToKey("Label",
"Sentiment")
.Append(mlContext.MulticlassClassification.Trainers.TextClassification(num
berOfClasses: 2, sentence1ColumnName: "Text"))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
// Train the model
var model = pipeline.Fit(reviewsDV);
我們可以看到?常簡潔,并不需要很多的機器學習/深度學習知識,這也讓更多 .NET 開發者能更快使?ML.NET 到項?中來。
5
小結
.NET 7 在 .NET 6 基礎上做了加?的操作,讓 .NET 朝著更好的???邁進了?步。對于眾多 .NET 開發者??,我們會繼續擁抱 .NET , 當然也希望有更多的?加?到 .NET 的開發?家庭中來。.NET 7 并不是終點,每次版本的發布都是?個重新的起點。希望 .NET 越來越好。
ps :這次 .NET Conf 2022 不僅有 .NET 7 , 官?也更新了,更加直觀好?,?家快快上去看看
最后希望?家記得?持我在 11? 10 ? 北京時間下午 13:30-14:00關于.NET做深度學習的課程。
相關文檔
1. 訪問 .NET 中?官??
https://dotnet.microsoft.com/zh-cn/
2.下載最新的 .NET 7?
https://dotnet.microsoft.com/en-us/download/dotnet/7.0
3.了解 C# 11?
https://learn.microsoft.com/dotnet/csharp/whats-new/csharp-11/?
wt.mc_id=ICX_dontnet22
4.了解 F# 6?
https://learn.microsoft.com/zh-cn/dotnet/fsharp/whats-new/fsharp-6?wt.mc_id=ICX_dontnet22
5.了解 .NET MAUI?
https://learn.microsoft.com/zh-cn/dotnet/maui/what-is-maui?
wt.mc_id=ICX_dontnet22
6.了解.NET 微服務相關內容 https://learn.microsoft.com/dotnet/architecture/microservices/?
wt.mc_id=ICX_dontnet22
7.了解 .NET Native AOT 技術?
https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/?
wt.mc_id=ICX_dontnet22
8.了解 Blazor?
https://learn.microsoft.com/zh-cn/aspnet/core/blazor/?wt.mc_id=ICX_dontnet22
CA周記往期回顧:
更多原創文章與資源共享
請關注Kinfey Techtalk