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

C#中的闭包

在 C# 中,闭包(Closure)是一种编程结构,它允许一个内部函数(也称为闭包函数)捕获和存储定义它的外部函数(也称为外部函数或父函数)的作用域中的变量。即使外部函数已经执行完毕并退出,闭包仍然可以访问这些变量。

闭包在 C# 中通常通过匿名方法(Anonymous Method)或 Lambda 表达式(Lambda Expression)来实现。匿名方法和 Lambda 表达式都是没有名称的内联函数,它们可以直接在声明它们的地方定义。

闭包的用途

闭包在 C# 中的主要用途包括:

  1. 事件处理器:捕获事件处理程序中所需的数据。

  2. 异步编程:在异步操作中保持状态。

  3. LINQ 查询:在查询表达式中使用捕获的变量。

  4. 回调函数:在回调中使用特定的数据。

示例

使用 Lambda 表达式创建闭包
using System;
​
class Program
{
    static void Main()
    {
        int outsideVariable = 10;
​
        // 创建一个闭包,它捕获了 outsideVariable 变量
        Func<int> closure = () => outsideVariable + 5;
​
        // 即使外部函数已经退出,闭包仍然可以访问 outsideVariable
        Console.WriteLine(closure()); // 输出: 15
​
        // 修改外部变量的值
        outsideVariable = 20;
​
        // 再次调用闭包,它仍然可以访问最新的外部变量值
        Console.WriteLine(closure()); // 输出: 25
    }
}

在这个例子中,Lambda 表达式 () => outsideVariable + 5 创建了一个闭包,它捕获了外部变量 outsideVariable。即使 Main 方法执行完毕,闭包仍然可以访问和使用这个变量。

在事件处理中使用闭包
using System;
​
class Program
{
    static void Main()
    {
        Button button = new Button("Click me!");
​
        // 使用闭包捕获外部变量
        button.Click += (sender, e) => Console.WriteLine("Button clicked! Count: " + outsideVariable);
​
        button.Click();
        button.Click();
    }
​
    static int outsideVariable = 0;
}
​
class Button
{
    public event EventHandler Click;
​
    public Button(string text)
    {
        // 构造函数中初始化按钮
    }
​
    public void Click()
    {
        outsideVariable++;
        Click?.Invoke(this, EventArgs.Empty);
    }
}

在这个例子中,事件处理器使用了闭包来捕获并使用 outsideVariable 变量。每次按钮被点击时,事件处理器都会输出当前的计数器值。

闭包是 C# 中一个强大的特性,它允许函数在定义它们的上下文中保持对变量的引用,即使这个上下文已经不存在。这使得闭包在处理事件、异步编程和其他需要保持状态的场景中非常有用。


http://www.kler.cn/news/302652.html

相关文章:

  • 2024.9.13 Python与图像处理新国大EE5731课程大作业,SIFT 特征和描述符,单应性矩阵透视变换
  • redis常见的数据类型?
  • 解决:Module build failed (from ./node_modules/sass-loader/dist/cjs.js)问题
  • 秋招突击——9/10、9\11——算法练习——携程笔试练习——2024年秋招第一批笔试
  • 数据库的实施过程分析
  • 【白话树】之 树的基本知识、存储结构和二叉树转换
  • RabbitMQ创建交换机和队列——配置类 注解
  • Idea 创建 Maven项目的时候卡死
  • 体育数据API纳米足球数据API:足球数据接口文档API示例⑫
  • 【解决方案】双系统中修复ubuntu引导
  • 【算法】-单调队列
  • 数据库系统 第43节 数据库复制
  • LabVIEW回转马达试验系统
  • Git撤销add
  • Flutter类
  • Vue:通过js控制css变量 - 一键修改全局样式
  • Docker 常用命令(未完待续...)
  • 外贸网站建设该怎么做
  • Certbot 生成 SSL 证书并配置自动续期
  • android 发一个可以下载的的android studio历史版本
  • 深度学习——pycharm配置远程服务器(蓝耘GPU智算云)
  • JavaScript拷贝的艺术:玩转深拷贝和浅拷贝
  • Arcgis字段计算器:随机生成规定范围内的数字
  • vue2中使用web worker启动定时器
  • 25届计算机专业选题推荐-基于微信小程序的校园快递驿站代收管理系统
  • 修改docker的默认存储位置及镜像存储位置
  • 无人机低空安全管控系统技术详解
  • 2024年9月13日随笔
  • c++中extern “C“的作用及理解
  • 【FFMPEG】FFplay音视频同步分析(下)