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

C#面试常考随笔9:什么是闭包?

最简单的例子:

Lambda可以访问Lambda表达式块外部的变量,叫闭包。

定义

闭包是指有权访问另一个函数作用域中的变量的函数。即使该函数已经执行完毕,其作用域内的变量也不会被销毁,而是会被闭包所捕获并保留,供闭包函数后续使用。

形成条件

  • 嵌套函数:在一个函数内部定义另一个函数。
  • 内部函数引用外部函数的变量:内部函数使用了外部函数作用域中的变量。

作用

  • 数据封装和隐藏:可以将变量封装在闭包内部,外部无法直接访问这些变量,从而实现数据的隐藏和保护。
  • 实现函数状态的持久化:闭包可以记住其创建时的环境,即使外部函数执行完毕,闭包仍然可以访问和修改外部函数作用域内的变量,实现函数状态的持久化。

C# 中的闭包示例

using System;

class Program
{
    static void Main()
    {
        // 调用 OuterFunction 方法,得到一个闭包函数
        Func<int> counter = OuterFunction();

        // 多次调用闭包函数
        Console.WriteLine(counter()); // 输出: 1
        Console.WriteLine(counter()); // 输出: 2
        Console.WriteLine(counter()); // 输出: 3
    }

    static Func<int> OuterFunction()
    {
        int count = 0;

        // 定义内部函数,形成闭包
        Func<int> innerFunction = () =>
        {
            count++;
            return count;
        };

        return innerFunction;
    }
}

在上述示例中,OuterFunction 是外部函数,它内部定义了一个变量 count 和一个 Lambda 表达式(内部函数)。这个 Lambda 表达式引用了外部函数的 count 变量,从而形成了闭包。当 OuterFunction 执行完毕后,返回了这个闭包函数。每次调用这个闭包函数时,都会访问并修改 count 变量的值,实现了计数功能。

闭包的优缺点

优点
  • 数据持久化:如上述示例所示,闭包可以让变量的值始终保持在内存中,方便后续使用。
  • 封装性:闭包可以将数据和操作封装在一起,对外提供统一的接口,提高代码的可维护性和安全性。
  • 实现回调和事件处理:在异步编程、事件处理等场景中,闭包可以方便地传递上下文信息,确保回调函数能够访问所需的数据。
缺点
  • 内存占用:由于闭包会持有对外部变量的引用,可能会导致这些变量无法被垃圾回收,从而增加内存占用。如果闭包使用不当,可能会造成内存泄漏。
  • 性能开销:闭包的创建和调用可能会带来一定的性能开销,尤其是在频繁创建闭包的情况下。

http://www.kler.cn/a/529856.html

相关文章:

  • vue入门到实战 二
  • 《基于Scapy的综合性网络扫描与通信工具集解析》
  • Java基础知识总结(三十七)--io异常的处理方式
  • WebForms DataList 深入解析
  • 自然语言处理-词嵌入 (Word Embeddings)
  • 31. 下一个排列
  • C++泛型编程指南04-(对默认调用参数的类型推断)
  • 最新码支付个人免签支付系统源码 三网免挂版本 兼容易支付
  • 【数据结构】_链表经典算法OJ:相交链表
  • linux中统计文件中特定单词或字符串的出现次数
  • CMake项目编译与开源项目目录结构
  • 面试常考题目——状态码总结
  • 96,【4】 buuctf web [BJDCTF2020]EzPHP
  • JavaFX - 事件处理
  • Mac上的虚拟化软件推荐
  • Go 中 defer 的机制
  • 基于开源AI智能名片2 + 1链动模式S2B2C商城小程序源码在抖音招商加盟中的应用与创新
  • web前端13--动画
  • 129.求根节点到叶节点数字之和(遍历思想)
  • 面试题:React实现鼠标托转文字绕原点旋转
  • DeepSeek是什么?横空出世意味着什么?
  • K8s介绍代理外部服务的svc几种方式
  • 力扣 215. 数组中的第K个最大元素
  • AWS EMR上的Spark日志实时搜索关键指标网页呈现的设计和实现
  • 测压表压力表计量表针头针尾检测数据集VOC+YOLO格式4862张4类别
  • 使用MATLAB进行雷达数据采集可视化