C# 10 新特性:Lambda 優(yōu)化
Intro
C# 10 對于 Lambda 做了很多的優(yōu)化,我們可以在 C# 中更加方便地使用委托和 Lambda 了,下面就來看一些示例
Lambda Enhancements
Natural types for lambdas
C# 10 可以更好做類型推斷,很多時候編譯器可以自動推斷類型,我們可以不用再顯式聲明委托類型了來看一個簡單的示例:
//?Func?func?=?()?=>?1;
var?func?=?()?=>?1;
//?Func?func2?=?()=>"Hello";
var?func2?=?()?=>?"Hello";
在之前的版本中我們是需要顯式聲明委托類型,如上述被注釋的代碼,在 C# 10 就可以直接使用 var 來聲明由編譯器去推斷委托的類型有些方法可能會有重載,支持不同的參數(shù)類型,編譯不能直接推斷出委托類型,我們可以指定輸入?yún)?shù)類型,示例如下:
//?Func?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
var?choose?=?object?(bool?b)?=>?b???1?:?"two";
這樣就不需要顯式聲明委托類型了,在上面的基礎(chǔ)上做了進(jìn)一步的幫助編譯器做推斷
Natual types for method
對于能夠推斷出類型的方法,我們也可以使用 var 來聲明委托,示例如下:
//?Action?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";app.MapPost("/todo",?[Authorize]()=>?"Success");app.MapPost("/todo",?[Authorize]()=>?"Success");
這在 ASP.NET Core Minimal API 中也有應(yīng)用,如:
app.MapPost("/todo",?[Authorize]()=>?"Success");
使用 ILSpy 查看低版本 C# 代碼,生成代碼如下:
[Description("Lambda?attribute")]
internal?int?b__4_0(string?s)
{
????return?int.Parse(s);
}
[Description("Lambda?attribute1")]
internal?object?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é)合上面的新特性來聲明,示例如下:
Expressionstring,?int>>?expr?=?(string?s)?=>?int.Parse(s);
LambdaExpression?parseExpr?=?object?(bool?b)?=>?b???1?:?"two";
Expression?parseExpr1?=?int??()?=>?null;


