当前位置: 首页 > 编程笔记 >

C# 中闭包(Closure)详解

卞坚成
2023-03-14
本文向大家介绍C# 中闭包(Closure)详解,包括了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# 里写了一个例子来验证这种想法。

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

 类似资料:
  • 本文向大家介绍Javascript闭包(Closure)详解,包括了Javascript闭包(Closure)详解的使用技巧和注意事项,需要的朋友参考一下 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函

  • 本文向大家介绍JavaScript中的闭包(Closure)详细介绍,包括了JavaScript中的闭包(Closure)详细介绍的使用技巧和注意事项,需要的朋友参考一下 闭包是JavaScript中一个重要的特性,其最大的作用在于保存函数运行过程中的信息。在JavaScript中,闭包的诸多特性源自函数调用过程中的作用域链上。   函数调用对象与变量的作用域链   对于JavaScript中的每

  • 主要内容:在闭包内部修改引用的变量,示例:闭包的记忆效应,示例:闭包实现生成器Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + 引用环境 = 闭包 同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。 图:闭包与函数引用 一个函数类型就像结构体一样,可以被实例化,函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”,

  • 本文向大家介绍LUA中的闭包(closure)浅析,包括了LUA中的闭包(closure)浅析的使用技巧和注意事项,需要的朋友参考一下 之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下 lua的函数是一种 First-Class Value 的东西, 到底是啥? 就是它们与传统类型的变值没啥区别, 可以 存到一个变量中,

  • 本文向大家介绍学习Javascript闭包(Closure)知识,包括了学习Javascript闭包(Closure)知识的使用技巧和注意事项,需要的朋友参考一下 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 另一方面,在函数外部自然无法读取

  • 本文向大家介绍php的闭包(Closure)匿名函数初探,包括了php的闭包(Closure)匿名函数初探的使用技巧和注意事项,需要的朋友参考一下 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个匿名函数是这样: 顺便提一下,PHP在引入闭包之前,也有一个可以创建匿名函数的函数:create function,但是代码逻辑只能写成字符串,这样