C#—闭包详解

[复制链接]
发表于 2025-10-15 13:44:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
闭包

注解
闭包在C#中是通过捕捉外部作用域的变量来实现的,使得内部函数可以访问这些变量。它们的作用包罗维持状态、支持函数式编程模式、简化变乱处置处罚和异步编程中的代码。应用场景涉及变乱处置处罚、异步方法、LINQ查询等。利用时须要注意变量捕捉的机会和生命周期,克制常见陷阱,比如循环中的变量捕捉题目。
在C#中,闭包(Closure)是一个非常告急的概念,特殊是在处置处罚函数和变量作用域时。闭包答应你在外部函数中界说一个内部函数,而且这个内部函数可以访问并利用外部函数的局部变量。纵然外部函数已经实行完毕,这些局部变量仍然可以在闭包中被内部函数访问。

闭包的工作原理
闭包重要由以下几个部门构成:

  • 外部函数:界说了闭包的环境,包罗局部变量。
  • 内部函数:可以访问外部函数的局部变量。

闭包的界说与核心机制


  • 界说:闭包是一个函数(如委托、Lambda表达式)与其引用的外部变量的绑定。这些变量的生命周期被延伸,与闭包共存。
  • 捕捉变量:闭包捕捉的是变量的引用(而非值),因别的部变量的修改会反映到闭包内。
  1. Func<int> CreateCounter()
  2. {
  3.     int count = 0;
  4.     return () => ++count; // Lambda捕获count变量
  5. }
  6. var counter = CreateCounter();
  7. Console.WriteLine(counter()); // 输出1
  8. Console.WriteLine(counter()); // 输出2(闭包维持count状态)
复制代码



 闭包的作用



  • 保持状态:闭包让函数携带私有状态(类似轻量级对象)。
  • 简化代码:克制为临时逻辑界说完备类,支持函数式编程风格。
  • 跨上下文访问:在异步、变乱或回调中访问原始作用域的变量。

应用场景


  • 变乱处置处罚:变乱回调访问界说时的变量。
  • 异步编程:在async/await中生存上下文变量。
  • LINQ查询:延长实行时捕捉变量。
  • 工厂模式:天生携带特定状态的函数。


准确利用闭包

克制循环陷阱
直接捕捉循环变量会导致全部闭包共享终极值:
  1. var actions = new List<Action>();
  2. for (int i = 0; i < 3; i++)
  3. {
  4.     int temp = i; // 局部临时变量
  5.     actions.Add(() => Console.WriteLine(temp));
  6. }
  7. foreach (var action in actions)
  8.     action(); // 输出0,1,2
复制代码
内存管理

  • 闭包延伸变量生命周期,大概导致内存走漏。实时开释无用的闭包引用。


实例

通过一下实例来深入相识闭包
  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         Console.WriteLine(GetClosureFunction()(30));
  6.     }
  7.     static Func<int, int> GetClosureFunction()
  8.     {
  9.         int val = 10;
  10.         Func<int, int> internalAdd = x => x + val;
  11.         Console.WriteLine(internalAdd(10));
  12.         val = 30;
  13.         Console.WriteLine(internalAdd(10));
  14.         return internalAdd;
  15.     }
  16. }
复制代码
上述代码的实行流程是Main函数调用GetClosureFunction函数,GetClosureFunction返回了委托internalAdd并被立刻实行了。
输出效果依次为20、40、60
对应到一开始提出的闭包的概念。这个委托internalAdd就是一个闭包,引用了外部函数GetClosureFunction作用域中的变量val。
注意:internalAdd有没有被当做返回值和闭包的界说无关。就算它没有被返回到外部,它仍然是个闭包。




总结


  • 上风:简化代码布局,支持状态封装,加强函数机动性。
  • 注意点:明白变量捕捉机制,克制循环中的错误捕捉,管理资源开释。






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表