C# 10 Lambda 语法的改进
C# 10 包括了对 Lambda 表达式的处理方式的许多改进:
- Lambda 表达式可以具有自然类型,这使编译器可从 Lambda 表达式或方法组推断委托类型。
- 如果编译器无法推断返回类型,Lambda 表达式可以声明该类型。
- 属性可应用于 Lambda 表达式。
这些功能使 Lambda 表达式更类似于方法和本地函数。 在不声明委托类型的变量的情况下,这些改进使得人们可以更容易使用 Lambda 表达式,并且它们可以与新的 ASP.NET Core 最小 API 更无缝地工作。
首先要介绍的是自动推断委派类型(inferred delegate type)。示例:
Func<string> hello = () => "Hello World";
Console.WriteLine(hello());
此示例在C# 9可以通过编译。到了C# 10,则因为编译器能够自动推断委派类型而可以使用var定义委派。
var hello = () => "Hello World"; // C# 9 无法编译!
但如果委派的回传值为null,编译器则无法判定你想回传什么类型,例如:
var hello = () => null; // 无法编译!
此时如果还是想用var来声明返回类型,则可以在撰写lambda表达式的时候定义返回类型
var hello = string? () => null; // OK!
当你的程序有很复杂的嵌套lambda语句,便可使用这种明确声明返回类型的方式来减轻编译器推断类型的负担,从而加快编译速度。这是lambda语法的第二项改进。
第三项改进是当我们把lambda表达式传入某方法的参数时,参数类型可以是object、Delegate、Expression
M1(() => "test"); // Func<string>
M2(() => "test"); // Func<string>
M3(() => "test"); // Expression<Func<string>>
void M1(object x) { }
void M2(Delegate x) { }
void M3(Expression x) { }
在C# 9中,第1行至第3行都无法通过编译(无法将lambda表达式转换成目标参数类型),C# 10则没有问题。
最后一项改进是,lambda表达式从现在开始可以套用特征项(attribute),包括匿名方法、方法参数、以及返回值,皆可套用。示例:
var fn1 = [Description("Hello")] () => "Hello";
var fn2 = ([Description("参数") string s) => "Hello " + s;
var fn3 = [Description("Hello")]
[return: Description("返回字符串")]
([Description("参数")] string s) => "Hello " + s;
说明:
- 为
fn1的匿名方法应用DescriptionAttribute修饰符,也就是给方法加上说明文字。 - 为
fn2的匿名方法加上参数的说明文字。 - 为
fn3的匿名方法、参数、返回类型都加上说明文字。
使用时机:某些API会去判断传入的委托方法是否应用了某些特性而有不同的行为,此时便可使用C# 10新增的lambda特性语法来撰写匿名方法,而不用像以前那样非得撰写具名方法不可。

作者:gmval
出处:https://www.cnblogs.com/gmval/p/17071237.html
本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。
关注个人公众号,定时同步更新优秀资源及技术文章
C# 10 Lambda 语法的改进的更多相关文章
- SQL,LINQ,Lambda语法对照图(转载)
如果你熟悉SQL语句,当使用LINQ时,会有似曾相识的感觉.但又略有不同.下面是SQL和LINQ,Lambda语法对照图 SQL LINQ Lambda SELECT * FROM HumanReso ...
- 初探Lambda表达式/Java多核编程【3】Lambda语法与作用域
接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍L ...
- Lisp使用Lambda语法
lamdba 其实就是一个匿名函数. 定义Lisp的lambda语法非常的简单,如下: (lambda ([parameter]) [experssion]) 调用lambda的语法有三种方法,如下: ...
- Lambda语法篇
函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口. Lambda语法 包含三个部分 一个括号内用逗号分隔 ...
- 通过这些示例快速学习Java lambda语法
对于那些不熟悉函数式编程的人来说,基本的Java lambda语法起初可能有点令人生畏.但是,一旦将lambda表达式分解为它们的组成部分,语法很快就会变得有意义并变得非常自然. Java中lambd ...
- jdk1.8的lambda语法(转)
原文链接:http://www.jb51.net/article/115081.htm 代码: package com.jdk_8; import org.junit.Test; import jav ...
- java1.8学习-什么样的匿名内部类能被lambda语法代替?
java1.8学习-什么样的匿名内部类能被lambda语法代替? java1.8好多新的特性真的很有意思,特别是Lambda.在学习的时候发现并不是所有的匿名内部类都可以用Lambda代替. lamb ...
- J2SE 8的Lambda --- 语法
语法例子 LambdaGrammarTest lambdaTest = new LambdaGrammarTest(); // 1. 能够推导出类型的,可以不写类型 String[] planets ...
- Lambda 语法
1.java8 Lambda表达式语法简介 (此处需要使用jdk1.8或其以上版本) Lambd表达式分为左右两侧 * 左侧:Lambda 表达式的参数列表 * 右侧:Lambda 表达式中所需要执行 ...
- Java中的10颗语法糖
语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...
随机推荐
- Vue中常用的几种传值方式
Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...
- Java Timer使用介绍
java.util包下提供了对定时任务的支持,涉及2个类: Timer:定时器类 TimerTask:任务抽象类 使用该定时任务我们需要继承TimerTask抽象类,覆盖run方法编写任务执行代码,并 ...
- 【lwip】08-ARP协议一图笔记及源码实现
目录 前言 8.1 IP地址与MAC地址 8.2 ARP协议简介 8.3 ARP协议报文 8.4 ARP缓存表 8.4.1 ARP缓存表简介 8.4.2 LWIP中的缓存表 8.4.3 ARP缓存表数 ...
- Maven 聚合工程的创建
简单场景举例 聚合工程创建示例 说明: 创建 Maven Project:表示创建 maven 项目,new Project 方式创建 创建 Maven Module:表示创建 maven 项目,ne ...
- 动态爱心-详细教程(小白也会)(HTML)
动态爱心 超级超级超级简单!!!赶紧做给你们的"Ta"看吧! (最后有详细步骤) 视频效果: 话不多说直接上代码 点击查看代码 <!DOCTYPE HTML PUBLIC & ...
- Nginx负载均衡策略的介绍与调优
工作中经常会用到nginx负载均衡这一块,下面对nginx负载均衡策略做个总结.本人在工作中最常用到的负载均衡策略是轮询策略. 在一般情况下,Web中间件最大的作用就是负责对请求进行分发,也就是我们常 ...
- 对比entrypoint以及cmd
如何查看 现有 images 的 入口信息 docker image inspect image_id { "entrypoint": "xxx" " ...
- 基于实战的Burp Suite插件使用Tips
基于实战的Burp Suite插件使用技巧 本篇文章首发于奇安信攻防社区 目录 基于实战的Burp Suite插件使用技巧 免责声明: 0×00前言 0×01专业版激活 0×02插件的环境安装 0×0 ...
- mindxdl---common--test_tools.go
// Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common define co ...
- HDLBits答案——Verilog Language
Verilog Language 1 Basics 1.1 Wire module top_module( input in, output out ); assign out = in; endmo ...