| 
闭包
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册  
 注解
 闭包在C#中是通过捕捉外部作用域的变量来实现的,使得内部函数可以访问这些变量。它们的作用包罗维持状态、支持函数式编程模式、简化变乱处置处罚和异步编程中的代码。应用场景涉及变乱处置处罚、异步方法、LINQ查询等。利用时须要注意变量捕捉的机会和生命周期,克制常见陷阱,比如循环中的变量捕捉题目。
 在C#中,闭包(Closure)是一个非常告急的概念,特殊是在处置处罚函数和变量作用域时。闭包答应你在外部函数中界说一个内部函数,而且这个内部函数可以访问并利用外部函数的局部变量。纵然外部函数已经实行完毕,这些局部变量仍然可以在闭包中被内部函数访问。
 
 闭包的工作原理
 闭包重要由以下几个部门构成:
 
 
 外部函数:界说了闭包的环境,包罗局部变量。
内部函数:可以访问外部函数的局部变量。
 闭包的界说与核心机制
 
 
 
 界说:闭包是一个函数(如委托、Lambda表达式)与其引用的外部变量的绑定。这些变量的生命周期被延伸,与闭包共存。
捕捉变量:闭包捕捉的是变量的引用(而非值),因别的部变量的修改会反映到闭包内。
 复制代码Func<int> CreateCounter(){    int count = 0;    return () => ++count; // Lambda捕获count变量}var counter = CreateCounter();Console.WriteLine(counter()); // 输出1Console.WriteLine(counter()); // 输出2(闭包维持count状态)
 
 闭包的作用
 
 
 
 保持状态:闭包让函数携带私有状态(类似轻量级对象)。
简化代码:克制为临时逻辑界说完备类,支持函数式编程风格。
跨上下文访问:在异步、变乱或回调中访问原始作用域的变量。
 应用场景
 
 
 
 变乱处置处罚:变乱回调访问界说时的变量。
异步编程:在async/await中生存上下文变量。
LINQ查询:延长实行时捕捉变量。
工厂模式:天生携带特定状态的函数。
 
 准确利用闭包
 
 克制循环陷阱
 直接捕捉循环变量会导致全部闭包共享终极值:
 内存管理复制代码var actions = new List<Action>();for (int i = 0; i < 3; i++){    int temp = i; // 局部临时变量    actions.Add(() => Console.WriteLine(temp));}foreach (var action in actions)    action(); // 输出0,1,2
 
 闭包延伸变量生命周期,大概导致内存走漏。实时开释无用的闭包引用。
 
 实例
 
 通过一下实例来深入相识闭包
 上述代码的实行流程是Main函数调用GetClosureFunction函数,GetClosureFunction返回了委托internalAdd并被立刻实行了。复制代码class Program{    static void Main(string[] args)    {        Console.WriteLine(GetClosureFunction()(30));    }    static Func<int, int> GetClosureFunction()    {        int val = 10;        Func<int, int> internalAdd = x => x + val;        Console.WriteLine(internalAdd(10));        val = 30;        Console.WriteLine(internalAdd(10));        return internalAdd;    }}
输出效果依次为20、40、60
 对应到一开始提出的闭包的概念。这个委托internalAdd就是一个闭包,引用了外部函数GetClosureFunction作用域中的变量val。
 注意:internalAdd有没有被当做返回值和闭包的界说无关。就算它没有被返回到外部,它仍然是个闭包。
 
 
 
 
 总结
 
 
 
 上风:简化代码布局,支持状态封装,加强函数机动性。
注意点:明白变量捕捉机制,克制循环中的错误捕捉,管理资源开释。
 
 
 
 
 
 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
 |