写点什么

.NET6 新东西 --Lambda 优化

作者:喵叔
  • 2021 年 11 月 19 日
  • 本文字数:1314 字

    阅读完需:约 4 分钟

在.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 新增的一些新内容,不需要死记硬背,只需要在实际运用是可以马上拿出来就好。

发布于: 5 小时前阅读数: 6
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6新东西--Lambda优化