.NET6 新东西 –Lambda 优化
在.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
你也许感兴趣的:
- 【外评】谷歌:从源头消除内存安全漏洞
- Linus正面回应Linux内核“Rust之争”:未来必定使用,完全生产级别尚需时日!
- 【外评】在 RiSC-V 上运行《巫师 3》游戏
- 【外评】法官驳回大部分 GitHub Copilot 版权索赔要求
- Node.js之父ry“摇人”——要求Oracle放弃JavaScript商标
- 【外评】一年的 Rust 开发总结
- “革命性”「Safe C++」扩展提案:质疑Rust、理解Rust、成为Rust?
- Rust 的崛起: 这种编程语言为何越来越受欢迎
- 谷歌内部推出 SQL 中的管道(Pipe)语法
- JavaScript 之父联手近万名开发者集体讨伐 Oracle:给 JavaScript 一条活路吧!
你对本文的反应是: