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 变量的值,实现了计数功能。

闭包的优缺点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr.勿忘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值