首页 > 编程语言 >C# 10 Lambda 语法的改进

C# 10 Lambda 语法的改进

时间:2023-01-28 20:44:06浏览次数:72  
标签:10 C# 类型 var Hello 表达式 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表达式传入某方法的参数时,参数类型可以是objectDelegateExpression

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;

说明:

  1. fn1的匿名方法应用DescriptionAttribute修饰符,也就是给方法加上说明文字。
  2. fn2的匿名方法加上参数的说明文字。
  3. fn3的匿名方法、参数、返回类型都加上说明文字。

使用时机:某些API会去判断传入的委托方法是否应用了某些特性而有不同的行为,此时便可使用C# 10新增的lambda特性语法来撰写匿名方法,而不用像以前那样非得撰写具名方法不可。


作者:gmval
出处:https://www.cnblogs.com/gmval/p/17071237.html
本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。
关注个人公众号,定时同步更新优秀资源及技术文章

标签:10,C#,类型,var,Hello,表达式,Lambda
From: https://www.cnblogs.com/gmval/p/17071237.html

相关文章

  • 关于 Dev-C++ 中缺少 iconv.h 的问题
    前言在C++中有个扩展库ext,里面有一些黑科技(hash,splay,binomial_heap等等),在Windows环境中,我们运行Dev-C++并在头文件写#include<bits/extc++.h>时,经常会收到......
  • unlock()简单使用
    unlock()作用是释放锁,和lock配合使用不释放时  解锁后 packagecom.java.test.lock;importlombok.extern.slf4j.Slf4j;importjava.util.ArrayList;import......
  • 【题解】[ABC286C] Rotate and Palindrome 题解
    更好的阅读体验洛谷题目传送门|AT原题传送门思路观察题目可以发现A操作最多只能执行\(n\)次,超过以后字符串又会回到初始状态。首先考虑A操作如何实现,一种办法......
  • DC-9
                                                   DC-9试验机:DC-7(网......
  • Fibonacci数列,从递归,O(N)迭代,动态规划,O(logN)矩阵快速幂到O(1)通项公式
    题目链接:剑指Offer10-I.斐波那契数列-力扣(LeetCode)朴素递归做法核心是一个递归边界和递归体,复杂度分析可画递归树可得,时间复杂度是O(2N),这是一个估算的上界,递归树......
  • 大公司为什么禁止SpringBoot项目使用Tomcat?
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招......
  • fastapi socketio http cros solved
    D:\code_gitee\fastapi-socketio-example-main\fastapi-socketio-example-main\app.pyimportosimportpathlibimportsecretsimporttimefromtypingimportOption......
  • C# 闭包类对弱引用的坑
    闭包、弱引用的简单概念,大佬们描述的很多,我引用下:理解C#中的闭包-黑洞视界-博客园(cnblogs.com)C#弱引用(WeakReference)-简书(jianshu.com)组里小伙伴报了个......
  • 3-reg model构建篇-uvm_reg_block
    1. uvm_reg_block的特点(1) 一个寄存器模型必须包含一个reg_block; 一般DUT内具有相同的基地址的所有寄存器,会放在一个reg_block中.(2) uvm_reg_block可以包含任意......
  • 【算法训练营day28】LeetCode93. 复原IP地址 LeetCode78. 子集 LeetCode90. 子集II
    LeetCode93.复原IP地址题目链接:93.复原IP地址独上高楼,望尽天涯想起来简单,写起来还是很难的一道题,小错误频发。慕然回首,灯火阑珊首先,因为本题要求只能分割成四段,所......