http://kb.cnblogs.com/page/111780/

 这个问题是在最近一次英格兰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”此时已经脱离了它当初的变量环境,但它仍然能用。

最新文章

  1. [LeetCode] Missing Ranges 缺失区间
  2. 学习AOP之JAVA的代理机制
  3. Javascript--装饰器模式和观察者模式
  4. 机器学习的5种语言(选自info world)
  5. 【转】SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
  6. HDU 1061 Rightmost Digit --- 快速幂取模
  7. The method onClick(View) of type new View.OnClickListener(){} must override a superclass
  8. xposed系列教程
  9. python百科
  10. js div 内容显示分页
  11. InstallShield打包
  12. 树的平衡 AVL Tree
  13. Jmeter_从jdbc请求的响应中获取参数做关联
  14. 手动调用run方法和普通方法调用没有区别
  15. 深入理解Java 8 Lambda(语言篇)
  16. Linux 中常用的命令
  17. Vue学习【第六篇】:Vue-cli脚手架(框架)与实战案例
  18. php 内网/外网ip判断
  19. 什么是词性标注(POS tagging)
  20. [转]使用C#开发ActiveX控件全攻略

热门文章

  1. TypeScript完全解读(26课时)_14.ES6和Nodejs中的模块
  2. Linux whereis 搜索命令位置
  3. hdu5883【欧拉通路】
  4. OPENGL_三角形带GL_TRIANGLE_STRIP详解
  5. 洛谷P2473 [SCOI2008]奖励关(期望+状压)
  6. [Xcode 实际操作]九、实用进阶-(10)定位设备的使用
  7. windows 修改鼠标滚轮自然滚动
  8. 关于在linux系统环境下解压rar压缩文件
  9. SpringBoot | 查看默认版本配置
  10. html Css PC 移动端 公用部分样式代码整理