时间:2021-05-19
C# 中闭包(Closure)详解
这个问题是在最近一次英格兰 Brighton ALT.NET Beers 活动中提出来的。我发现,如果不用代码来演示,你很难单用话语把它解释清楚,所以,在这里,我打算用 C# 来解释一下什么是闭包(closures)。维基百科上说:
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
所以,一个闭包就是一个“捕获”或“携带”了其被生成的环境中、所属的变量范围内所引用的所有变量的函数。的确,很难描述,但当你看完了这些代码后,你就很容易理解了。
这里我们首先定义了一个变量“x”,值为1。然后我们定义了一个匿名函数(一个 lambda 表达式)赋给类型 Action。Action 没有参数, 没有返回值,但如果你观察“action”里的定义,你会发现它使用了“x”变量。这是变量是被 action“捕获”或“携带”的,自动被添加到了 action 的运行环境中了。
当我们执行 action 时,它输出了我们预期的结果。请注意,当我们执行时,原始的“x”此时已经脱离了它当初的变量环境,但它仍然能用。
当你在代码调试器(debugger)里观察“action”时,会发现很有趣的事情。我们可以看到,C# 编译器为我们创建了一个 Target 类,里面封装了 x 变量:
闭包(Closure)
闭包(和 higher order functions)都是非常有用的东西。如果你曾经开发过稍微复杂一点的 JavaScript 程序,你可能就会知道,这个东西可以被当成很多面向对象特征的替代品,就像 C# 那样。前不久我还在 C# 里写了一个例子来验证这种想法。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
概述在JavaScript前端开发中,函数与对其状态即词法环境(lexicalenvironment)的引用共同构成闭包(closure)。也就是说,闭包可以让
本文实例讲述了javascript闭包(Closure)用法。分享给大家供大家参考,具体如下:closure被翻译成“闭包”,感觉这东西被包装的太学术化。下面参
什么是闭包?简单说,闭包就是根据不同的配置信息得到不同的结果。再来看看专业的解释:闭包(Closure)是词法闭包(LexicalClosure)的简称
什么是闭包闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是:闭包就是函数的
简介闭包closure是javascript中一个非常强大的功能。所谓闭包就是函数中的函数,内部函数可以访问外部函数的作用域范围,从而可以使用闭包来做一些比较强