欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

C# 中闭包(Closure)详解

时间:2022-04-29 10:09:08|栏目:.NET代码|点击:

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#提取网页中超链接link和text部分的方法

栏    目:.NET代码

下一篇:C# 表达式目录树Expression的实现

本文标题:C# 中闭包(Closure)详解

本文地址:http://www.codeinn.net/misctech/200537.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有