C# 10 新特性 —— Lambda 优化
C# 10 新特性 —— Lambda 優(yōu)化
Intro
C# 10 對于 Lambda 做了很多的優(yōu)化,我們可以在 C# 中更加方便地使用委托和 Lambda 了,下面就來看一些示例
Lambda Enhancements
Natural types for lambdas
C# 10 可以更好做類型推斷,很多時候編譯器可以自動推斷類型,我們可以不用再顯式聲明委托類型了
來看一個簡單的示例:
//?Func<int>?func?=?()?=>?1; var?func?=?()?=>?1; //?Func<string>?func2?=?()=>"Hello"; var?func2?=?()?=>?"Hello";在之前的版本中我們是需要顯式聲明委托類型,如上述被注釋的代碼,在 C# 10 就可以直接使用 var 來聲明由編譯器去推斷委托的類型
有些方法可能會有重載,支持不同的參數(shù)類型,編譯不能直接推斷出委托類型,我們可以指定輸入?yún)?shù)類型,示例如下:
//?Func<string,?int>?parse?=?(string?s)?=>?int.Parse(s); var?parse?=?(string?s)?=>?int.Parse(s);Lambda Ref/Out/In Parameter Modifier
我們可以在指定輸入?yún)?shù)類型的時候,可以設(shè)置 ref/out/int 來表示一個值類型的引用傳遞,示例如下:
var?refFunc?=?(ref?int?x)?=>?{?x++;?}; var?outFunc?=?(out?int?x)?=>?{?x?=?-1;?}; var?inFunc?=?(in?int?x)?=>?{?};var?num?=?1; refFunc(ref?num); Console.WriteLine(num);outFunc(out?num); Console.WriteLine(num);輸出結(jié)果分別是 2 和 -1
Lambda Return Type
C# 10 的委托可以指定返回類型,這樣我們在返回委托的時候可能就會比較方便了,比如下面的示例:
//?return?type var?lambdaWithReturnValue0?=?int??()?=>?null; //?return?type?and?input?type var?lambdaWithReturnValue1?=?int??(string?s)=>?string.IsNullOrEmpty(s)???1?:?null; //?Func<bool,?object> var?choose?=?object?(bool?b)?=>?b???1?:?"two";這樣就不需要顯式聲明委托類型了,在上面的基礎(chǔ)上做了進(jìn)一步的幫助編譯器做推斷
Natual types for method
對于能夠推斷出類型的方法,我們也可以使用 var 來聲明委托,示例如下:
//?Action<string>?func3?=?LocalMethod; var?func3?=?LocalMethod; void?LocalMethod(string?a) {Console.WriteLine(a); }var?checkFunc?=?string.IsNullOrEmpty; var?read?=?Console.Read;Action<string>?write?=?Console.Write;對于不能推斷類型的則需要顯式聲明類型委托類型,如上面最后一個委托 Console.Write 的參數(shù)會有多個重載,不能準(zhǔn)確推斷類型,所以需要聲明委托類型
Lambda Attribute
現(xiàn)在我們可以在 Lambda 表達(dá)式中指定 Attribute
var?parse3?=[Description("Lambda?attribute")](string?s)?=>?int.Parse(s); var?choose3?=[Description("Lambda?attribute1")]object?(bool?b)?=>?b???1?:?"two";這在 ASP.NET Core Minimal API 中也有應(yīng)用,如:
app.MapPost("/todo",?[Authorize]()=>?"Success");使用 ILSpy 查看低版本 C# 代碼,生成代碼如下:
[Description("Lambda?attribute")] internal?int?<Main>b__4_0(string?s) {return?int.Parse(s); }[Description("Lambda?attribute1")] internal?object?<Main>b__4_1(bool?b) {return?b???((object)1)?:?"two"; }More
這些 Lambda 的優(yōu)化可以讓我們更加方便地使用 lambda,在 ASP.NET Core 中也有著很多的應(yīng)用
app.Map("/",?()?=>?"Hello?world"); app.MapPost("/auth",?[Authorize]()=>?"Authorize?needed");在聲明 Lambda 的時候可以自動轉(zhuǎn)成 Expression,我們也可以結(jié)合上面的新特性來聲明,示例如下:
Expression<Func<string,?int>>?expr?=?(string?s)?=>?int.Parse(s); LambdaExpression?parseExpr?=?object?(bool?b)?=>?b???1?:?"two"; Expression?parseExpr1?=?int??()?=>?null;References
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/lambda-improvements?WT.mc_id=DT-MVP-5004222
https://devblogs.microsoft.com/dotnet/welcome-to-csharp-10/?WT.mc_id=DT-MVP-5004222#improvements-for-lambda-expressions-and-method-groups
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-expressions?WT.mc_id=DT-MVP-5004222
https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp10Sample/LamdbaEnhancement.cs
總結(jié)
以上是生活随笔為你收集整理的C# 10 新特性 —— Lambda 优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Windbg 分析一个 异步操作
- 下一篇: 在 C# 中如何获取存储过程的返回值 ?