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

20250606-C#知识:匿名函数、Lambda表达式与闭包

C#知识:匿名方法、Lambda表达式与闭包

闭包乍一听感觉很复杂,其实一点也不简单


1、匿名方法

  • 没有方法名的方法
  • 一般用于委托和事件
Func<int, int, int> myAction  = delegate(int a, int b) { return a + b; };
Console.WriteLine( myAction(1, 2)); //3

2、Lambda表达式

  • 作用类似匿名函数
  • 可以省略参数类型,大括号和return关键字
myAction = (a, b) => a * b;
Console.WriteLine(myAction(2,3));   //6

3、闭包

  • 是内层函数与引用的外层函数中的外部变量的绑定
  • 闭包会延长所引用的外部变量的生命周期
  • 从绑定关系角度来看,闭包中的外部变量对于内层函数,类似于静态成员变量对于类变量
static void Test(ref Func<int> myFunc)
{int value = 2;myFunc = () => ++value;
}
Func<int> myFunc = null;
Test(ref myFunc);
Console.WriteLine(myFunc());    //3
Console.WriteLine(myFunc());    //4
  • 内层函数会捕获外部变量的引用

这里闭包中捕获的是myCake对象的引用,在外面修改了myCake对象的成员变量的值,修改也会反映到闭包中。

static Cake Test2(ref Func<int> myFunc) 
{Cake myCake = new Cake(100);myFunc = () => ++myCake.price;myCake.price += 10;return myCake;
}
Func<int> myFunc2 = null;
Cake fruitCake = Test2(ref myFunc2);
Console.WriteLine(myFunc2());   //111
Console.WriteLine(myFunc2());   //112
fruitCake.price = 10086;
Console.WriteLine(myFunc2());   //10087
Console.WriteLine(myFunc2());   //10088

4、完整代码示例

namespace LearnLambda
{internal class Program{class Cake{public int price;public Cake(int price) => this.price = price;}static void Test(ref Func<int> myFunc){int value = 2;myFunc = () => ++value;}static Cake Test2(ref Func<int> myFunc) {Cake myCake = new Cake(100);myFunc = () => ++myCake.price;myCake.price += 10;return myCake;}static void Main(string[] args){//匿名方法Func<int, int, int> myAction  = delegate(int a, int b) { return a + b; };Console.WriteLine( myAction(1, 2)); //3//Lambda表达式myAction = (a, b) => a * b;Console.WriteLine(myAction(2,3));   //6//闭包Func<int> myFunc = null;Test(ref myFunc);Console.WriteLine(myFunc());    //3Console.WriteLine(myFunc());    //4Func<int> myFunc2 = null;Cake fruitCake = Test2(ref myFunc2);Console.WriteLine(myFunc2());   //111Console.WriteLine(myFunc2());   //112fruitCake.price = 10086;Console.WriteLine(myFunc2());   //10087Console.WriteLine(myFunc2());   //10088}}
}

5、参考资料

  1. 《唐老狮C#》
  2. C#—闭包详解

本篇结束,感谢您的阅读~

在这里插入图片描述

相关文章:

  • C#中datagridview单元格value为{}大括号
  • Compose基本介绍
  • 8.1_排序的基本概念
  • 【C++】24. 哈希表的实现
  • Day46
  • 消息队列高级特性与原理:解锁分布式系统的底层逻辑
  • 【信息系统项目管理师-论文真题】2025上半年(第一批)论文详解(包括解题思路和写作要点)
  • 【大模型LLM学习】Flash-Attention的学习记录
  • PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式
  • 主流定位技术:Zigbee、蓝牙、UWB、RFID、5G通信介绍及对比
  • PCB特种工艺应用扩展:厚铜、高频与软硬结合板
  • 视觉SLAM基础补盲
  • 【Kotlin】协程
  • 准确--k8s cgroup问题排查
  • 紫光同创FPGA系列实现Aurora 8b/10b协议
  • 单芯片电流采用电路分享
  • Tongweb配置跳过扫描应用jar的配置指引(by lqw)
  • 山东大学算法设计与分析复习笔记
  • 【PhysUnits】16.2 引入变量后的乘法实现(mul.rs)
  • arduino开发遇见的问题(求助!!)
  • php旅游网站模板下载/100%上热门文案
  • 新网站制作怎么样/长沙seo外包优化
  • 品牌网站设计服务/seo排名赚挂机赚钱软件下载
  • 大连网站建设怎么做/seo搜索排名影响因素主要有
  • 自动推广工具/seo优化教学视频
  • wordpress菜单子页面/seo门户网价格是多少钱