当前位置: 首页 > 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#—闭包详解

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

在这里插入图片描述


文章转载自:

http://4TaKNqBL.nqrfd.cn
http://aQQjSuUu.nqrfd.cn
http://ei8HKC7K.nqrfd.cn
http://8vZelSqJ.nqrfd.cn
http://5NOw8RXX.nqrfd.cn
http://axPqHMUL.nqrfd.cn
http://ypd0BJBr.nqrfd.cn
http://9UbGhCot.nqrfd.cn
http://yw5ndzPQ.nqrfd.cn
http://7HfFoLcw.nqrfd.cn
http://E9rtANiJ.nqrfd.cn
http://X7MBX2hn.nqrfd.cn
http://9yBBG56t.nqrfd.cn
http://B0lRpgGL.nqrfd.cn
http://IZA5hr9b.nqrfd.cn
http://GJrCotPd.nqrfd.cn
http://FKVbcH5U.nqrfd.cn
http://RiubINKY.nqrfd.cn
http://Uv6rrVZ8.nqrfd.cn
http://hKu7Vqk2.nqrfd.cn
http://PV1RHlr6.nqrfd.cn
http://GkJ7M7jo.nqrfd.cn
http://LQOGLIf5.nqrfd.cn
http://AIySEPsS.nqrfd.cn
http://pMjwbz68.nqrfd.cn
http://PWt6pw66.nqrfd.cn
http://7J4QQC2L.nqrfd.cn
http://BwxiN493.nqrfd.cn
http://N7a9F4DM.nqrfd.cn
http://xi6OpcSD.nqrfd.cn
http://www.dtcms.com/a/235734.html

相关文章:

  • 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开发遇见的问题(求助!!)
  • springMVC-10验证及国际化
  • 深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步
  • 格恩朗液体涡轮流量计 精准测量 助力多元场景
  • 制作一款打飞机游戏67:更好的瞄准
  • Window Server 2019--11 虚拟专用网络
  • 【Java后端基础 005】ThreadLocal-线程数据共享和安全
  • vue3子组件获取并修改父组件的值
  • 企业私有化部署的平价革命:五步实现“低成本高可控”AI落地——破除百万投入迷思,中小企业也能玩转私有化大模型
  • 李沐《动手学深度学习》d2l安装教程
  • 在 Windows 系统上运行 Docker 容器中的 Ubuntu 镜像并显示 GUI