在.NET6 中 C#对 Lambda 做了许多的优化,使得我们可以在 C#中更加方便地使用委托和 Lambda。下面我们就通过一些案例来讲解一下.NET6 中的 Lambda。

一、增强 Lambda

使用增强 Lambda 可以使 C#更好的做类型推断,在很多时候编译器能自动推断类型,我们不用再显式声明委托类型。下面来看一个简单的示例:

//之前版本的用法
Func<int> func = () => 1;
Func<string> func2 = ()=>"Hello";
//.NET6中C#的用法
var func = () => 1;
var func2 = () => "Hello";

在之前的版本中我们是需要显式声明委托类型(代码第一行和第二行),但是在.NET6 中可以直接使用 var 关键字来声明委托,委托的具体类型由编译器去推断。对于具有重载的方法,编译不能直接推断出委托类型,这是我们就需要指定输入的参数类型,案例代码如下所示:

//之前版本的写法
Func<string, int> parse = (string str) => int.Parse(str);
//.NET6中的写法
var parse = (string str) => int.Parse(str);

二、Lambda 中的 Ref、Out 和 In 参数修饰符

在指定输入参数类型的时候我们可以设置 ref、out 或 in 修饰符表示一个值类型的引用传递,案例代码如下:

var funOut = (out int x) => { x = -100; };
var funRef = (ref int x) => { x++; };
var funIn = (in int x) => { };
var n= 99;
outFunc(out n);
Console.WriteLine(n);
refFunc(ref n);
Console.WriteLine(n);

输出结果分别是 -100 和 100

三、Lambda Return Type

在.NET6 中我们可以给委托指定返回类型,案例如下:

var lambdaReturn1 = int?() => null;
var lambdaReturn2 = int?(string str) => string.IsNullOrEmpty(str) ? 100 : null;
var choose = object (bool bl) => bl ? 100 : "一百";

四、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 方法的参数有多个重载,因此并不能准确推断类型因此需要声明委托类型。

五、Lambda 属性

.NET6 中我们可以在 Lambda 表达式中指定属性,就像下面这样:

var parse3 =[Description("Lambda属性")](string str) => int.Parse(str);
var choose3 =[Description("Lambda属性")]object (bool bl) => bl ? 1 : "你好";

同样,在 ASP.NET Core Minimal API 中也有类似的应用,比如下面的代码:

app.MapPost("/todo", [Authorize]()=> "todo");

这些 lambda 的新特性让我们更加方便地使用 lambda,尤其是在 ASP.NET Core 中有着大量且广泛的应用。在声明 lambda 的时候也可以自动转成 Expression,结合前面所说的新特性,我们来编写一个例子:

Expression<Func<string, int>> expr = (string str) => int.Parse(str);
LambdaExpression parseExpr1 = object (bool bl) => bl ? 100 : "一百";
Expression parseExpr2 = int? () => null;

六、结语

前面所展示的就是.NET6 中 lambda 新增的一些新内容,不需要死记硬背,只需要在实际运用是可以马上拿出来就好。

本文文字及图片出自 InfoQ

余下全文(1/3)
分享这篇文章:

请关注我们:

发表评论

邮箱地址不会被公开。 必填项已用*标注