12.什么是C#中的闭包

  1. 12.什么是闭包
    1. 12.1 题目
    2. 12.2 深入解析
    3. 12.3 答题示例
    4. 12.4 关键词联想

12.什么是闭包


12.1 题目

什么是闭包?可以举例说明。


12.2 深入解析

闭包(Closure)是指函数与其词法环境的组合,它允许函数在定义时所处的作用域之外继续访问和操作那些作用域中的变量。具体要点:

  1. 词法作用域

    • 函数定义的位置决定了它能访问哪些外部变量,无论函数在哪里调用,这些变量都保持可访问性。
  2. 环境捕获

    • 闭包会“捕获”外部作用域中的变量;在 C# 中捕获的局部变量会提升到编译器生成的闭包类字段中,从而在委托存活期间保持状态。
  3. 变量生命周期延长

    • 被捕获的变量的生命周期不再局限于原作用域,直到闭包不再被引用才会被回收。
  4. 典型示例(C#)

    Func<int> CreateCounter()
    {
        int count = 0;
        return () =>
        {
            count++;
            return count;
        };
    }
    
    var counter = CreateCounter();
    Console.WriteLine(counter()); // 输出 1
    Console.WriteLine(counter()); // 输出 2
    
    • 这里返回的 lambda 表达式就是一个闭包,它捕获了 count 变量,使得 count 的值在 CreateCounter 方法返回后仍然保留并累加。

12.3 答题示例

“闭包是函数与其定义时作用域的变量环境打包在一起的结构,它能让函数在外部作用域之外继续访问和修改这些变量。比如在 C# 中返回一个 lambda,内部捕获并累加局部变量,这个 lambda 就是闭包。”


12.4 关键词联想

  • 词法作用域
  • 环境捕获
  • 变量生命周期
  • Lambda / Delegate
  • 状态保持
  • 函数工厂


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏