C# 中闭包(Closure)详解

 更新时间:2017年06月06日 15:31:01   投稿:lqh  
这篇文章主要介绍了C# 中闭包(Closure)详解的相关资料,需要的朋友可以参考下

C# 中闭包(Closure)详解

这个问题是在最近一次英格兰 Brighton ALT.NET Beers 活动中提出来的。我发现,如果不用代码来演示,你很难单用话语把它解释清楚,所以,在这里,我打算用 C# 来解释一下什么是闭包(closures)。维基百科上说:

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

所以,一个闭包就是一个“捕获”或“携带”了其被生成的环境中、所属的变量范围内所引用的所有变量的函数。的确,很难描述,但当你看完了这些代码后,你就很容易理解了。

var x = 1;
Action action = () =>
{
 var y = 2;
 var result = x + y;
 Console.Out.WriteLine("result = {0}", result);
};
action();

这里我们首先定义了一个变量“x”,值为1。然后我们定义了一个匿名函数(一个 lambda 表达式)赋给类型 Action。Action 没有参数, 没有返回值,但如果你观察“action”里的定义,你会发现它使用了“x”变量。这是变量是被 action“捕获”或“携带”的,自动被添加到了 action 的运行环境中了。

当我们执行 action 时,它输出了我们预期的结果。请注意,当我们执行时,原始的“x”此时已经脱离了它当初的变量环境,但它仍然能用。

当你在代码调试器(debugger)里观察“action”时,会发现很有趣的事情。我们可以看到,C# 编译器为我们创建了一个 Target 类,里面封装了 x 变量:

闭包(Closure)

闭包(和 higher order functions)都是非常有用的东西。如果你曾经开发过稍微复杂一点的 JavaScript 程序,你可能就会知道,这个东西可以被当成很多面向对象特征的替代品,就像 C# 那样。前不久我还在 C# 里写了一个例子来验证这种想法。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C#使用OpenCvSharp实现透视变换功能

    C#使用OpenCvSharp实现透视变换功能

    这篇文章主要为大家详细介绍了C#如何使用OpenCvSharp实现透视变换的功能,文中的示例代码简洁易懂,具有一定的学习价值,需要的小伙伴可以参考下
    2023-11-11
  • C#实现控制电脑注销,关机和重启

    C#实现控制电脑注销,关机和重启

    这篇文章主要为大家介绍了C#如何实现控制电脑注销,关机和重启功能,本案例涉及的知识点包含:Process、Shell32.dll、User32.dll、Struct数据结构,感兴趣的可以了解一下
    2022-09-09
  • C#实现双端队列的示例代码

    C#实现双端队列的示例代码

    双端队列是一种可以在两端扩展或收缩的序列化容器,本文主要介绍了C#实现双端队列的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#生成不重复随机数列表实例

    C#生成不重复随机数列表实例

    C#生成不重复随机数列表实例的代码,需要的朋友可以参考一下
    2013-02-02
  • C# 禁用鼠标中间键的方法

    C# 禁用鼠标中间键的方法

    关于 C# System.Windows.Forms.NumericUpDown 控件,如何禁用鼠标中间键?
    2013-03-03
  • C#中list用法实例

    C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 无法从 int? 转换为 int 运行时出现错误

    无法从 int? 转换为 int 运行时出现错误

    无法从"int?"转换为"int" ,在运行时会出现错误,通过强制类型转换(int)便可解决
    2014-05-05
  • 基于C#实现一个简单的FTP操作工具

    基于C#实现一个简单的FTP操作工具

    这篇文章主要为大家详细介绍了如何利用C#实现一个简单的FTP操作工具,可以实现FTP上传、下载、重命名、刷新、删除功能,感兴趣的可以了解一下
    2022-08-08
  • C#面向对象编程基础概念汇总

    C#面向对象编程基础概念汇总

    今天小编就为大家分享一篇关于C#面向对象编程基础概念汇总的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 解析C#中的分部类和分部方法

    解析C#中的分部类和分部方法

    这篇文章主要介绍了C#中的分部类和分部方法,讲解了类的拆分和方法的定义的拆分,需要的朋友可以参考下
    2016-01-01

最新评论