当前位置: 首页 > java >正文

【C#补全计划】Lambda表达式

一、lambda表达式的概念

1. 可以将lambda表达式理解为匿名函数的简写

2. lambda表达式除了写法不同外,使用上和匿名函数一模一样,都是配合委托或事件使用的

二、lambda表达式的语法

1. 语法:

        (1)匿名函数

delegate (参数列表) {

        // 代码块

}

        (2)lambda表达式

(参数列表) => {

        // 代码块

}

三、lambda表达式的使用

1. 无参无返回值

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();}}
}

2. 有参无返回值

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);}}
}

3. 参数类型可以省略:与委托或事件容器一致

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");}}
}

4. 无参有返回值

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);}}
}

5. 有参有返回值

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);// 有参有返回值Func<int, string> function2 = (int a) =>{return "有参有返回值的lambda表达式";};string s2 = function2.Invoke(10);Console.WriteLine(s2);}}
}

6. 作为函数参数传递

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);// 有参有返回值Func<int, string> function2 = (int a) =>{return "有参有返回值的lambda表达式";};string s2 = function2.Invoke(10);Console.WriteLine(s2);Test test = new Test();// 作为函数参数传递test.toDo("使用其他参数", () =>{Console.WriteLine("作为参数传递的lambda表达式");});}}class Test{public Action action;// 作为参数传递时public void toDo(string s, Action a){Console.WriteLine(s);a.Invoke();}}
}

7. 作为函数返回值

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);// 有参有返回值Func<int, string> function2 = (int a) =>{return "有参有返回值的lambda表达式";};string s2 = function2.Invoke(10);Console.WriteLine(s2);Test test = new Test();// 作为函数参数传递test.toDo("使用其他参数", () =>{Console.WriteLine("作为参数传递的lambda表达式");});// 作为函数返回值test.getFun()(); // 直接调用返回的委托函数}}class Test{public Action action;// 作为参数传递时public void toDo(string s, Action a){Console.WriteLine(s);a.Invoke();}// 作为返回值public Action getFun(){return () =>{Console.WriteLine("作为返回值返回的lambda表达式");};}}
}

运行结果如下:

四、闭包

1. 概念:内层的函数可以引用包含在它外层的函数的变量,即使外层函数的执行已经终止

2. 代码:

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);// 有参有返回值Func<int, string> function2 = (int a) =>{return "有参有返回值的lambda表达式";};string s2 = function2.Invoke(10);Console.WriteLine(s2);Test test = new Test();// 作为函数参数传递test.toDo("使用其他参数", () =>{Console.WriteLine("作为参数传递的lambda表达式");});// 作为函数返回值test.getFun()(); // 直接调用返回的委托函数}}class Test{public Action action;// 作为参数传递时public void toDo(string s, Action a){Console.WriteLine(s);a.Invoke();}// 作为返回值public Action getFun(){return () =>{Console.WriteLine("作为返回值返回的lambda表达式");};}}class Test2{public event Action action;public Test2(){int value = 10;// 闭包// 当构造函数执行完毕时,声明的临时变量value的生命周期被改变了action = () =>{Console.WriteLine(value); };}public void toDo(){action.Invoke();}}
}

运行结果如下:

3. 注意:该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);// 有参有返回值Func<int, string> function2 = (int a) =>{return "有参有返回值的lambda表达式";};string s2 = function2.Invoke(10);Console.WriteLine(s2);Test test = new Test();// 作为函数参数传递test.toDo("使用其他参数", () =>{Console.WriteLine("作为参数传递的lambda表达式");});// 作为函数返回值test.getFun()(); // 直接调用返回的委托函数// 闭包Test2 test2 = new Test2();test2.toDo();}}class Test{public Action action;// 作为参数传递时public void toDo(string s, Action a){Console.WriteLine(s);a.Invoke();}// 作为返回值public Action getFun(){return () =>{Console.WriteLine("作为返回值返回的lambda表达式");};}}class Test2{public event Action action;public Test2(){int value = 100;// 闭包// 当构造函数执行完毕时,声明的临时变量value的生命周期被改变了action = () =>{Console.WriteLine(value); };// 注意:该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值for (int i = 0; i < 10; i++) {action += () =>{Console.WriteLine(i);};}}public void toDo(){action.Invoke();}}
}

运行结果如下:(输出的不是0~9,而是i的最终值10)

4. 若想输出0~9,修改如下:

using System;namespace LambdaExpression
{class Program{static void Main(string[] args){// 无参无返回值Action action1 = () =>{Console.WriteLine("无参无返回值的lambda表达式");};action1.Invoke();// 有参无返回值Action<int> action2 = (int a) =>{Console.WriteLine("有参无返回值的lambda表达式");};action2.Invoke(10);// 参数类型可以省略:与委托或事件容器一致Action<int, string> action3 = (a, s) =>{Console.WriteLine("省略参数类型的lambda表达式");};action3.Invoke(10, "hello");// 无参有返回值Func<string> function1 = () =>{return "无参有返回值的lambda表达式";};string s1 = function1.Invoke();Console.WriteLine(s1);// 有参有返回值Func<int, string> function2 = (int a) =>{return "有参有返回值的lambda表达式";};string s2 = function2.Invoke(10);Console.WriteLine(s2);Test test = new Test();// 作为函数参数传递test.toDo("使用其他参数", () =>{Console.WriteLine("作为参数传递的lambda表达式");});// 作为函数返回值test.getFun()(); // 直接调用返回的委托函数// 闭包Test2 test2 = new Test2();test2.toDo();}}class Test{public Action action;// 作为参数传递时public void toDo(string s, Action a){Console.WriteLine(s);a.Invoke();}// 作为返回值public Action getFun(){return () =>{Console.WriteLine("作为返回值返回的lambda表达式");};}}class Test2{public event Action action;public Test2(){int value = 100;// 闭包// 当构造函数执行完毕时,声明的临时变量value的生命周期被改变了action = () =>{Console.WriteLine(value); };// 注意:该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值for (int i = 0; i < 10; i++) {int index = i; // 每次循环都会创建一个新的index变量action += () =>{Console.WriteLine(index);};}}public void toDo(){action.Invoke();}}
}

运行结果如下:

        今天的学习就到这里了。感谢阅读。

        再见!

http://www.xdnf.cn/news/17982.html

相关文章:

  • java 面试八股集锦
  • 企业级Java项目金融应用领域——银行系统(补充)
  • 力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II
  • PMP-项目管理-十大知识领域:整合管理-协调各知识领域,确保项目目标一致
  • webpack
  • 架构调整决策
  • 基础数据结构
  • 027 动静态库 —— 静态库
  • 马拉松|基于SSM的马拉松报名系统微信小程序的系统设计与实现(源码+数据库+文档)
  • uniapp:微信小程序使用Canvas 和Canvas 2D绘制图形
  • 给纯小白的Python操作Word笔记
  • 使用npm/pnpm自身安装指定版本的pnpm
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • Vue3从入门到精通:5.2 Vue3构建工具与性能优化深度解析
  • 同创物流学习记录2·电车光电
  • 【八股】计网-计算机网络-秋招
  • Windows MCP.Net:革命性的 .NET Windows 桌面自动化 MCP 服务器
  • 分享一个大数据的源码实现 基于Hadoop的二手车市场数据分析与可视化 基于Spark的懂车帝二手车交易数据可视化分析系统
  • ABB焊接机器人弧焊省气
  • ubuntu远程桌面很卡怎么解决?
  • 深入剖析跳表:高效搜索的动态数据结构
  • JavaScript 逻辑运算符与实战案例:从原理到落地
  • 杂记 02
  • Docker安装——配置国内docker镜像源
  • Python从入门到高手9.3节: 利用字典进行格式化
  • std::copy_if
  • 告别手动优化!React Compiler 自动记忆化技术深度解析
  • 47.分布式事务理论
  • 【大模型微调系列-03】 大模型数学基础直观入门
  • PyInstaller打包Python应用操作备忘