【发布时间】:2009-04-17 10:07:03
【问题描述】:
我去过reading this article about closures,他们说:
- “所有管道都是自动的”
- 编译器“创建一个包装类”并“延长变量的寿命”
- “您可以放心使用局部变量”
- .NET 编译器会为您处理管道等问题。
所以我根据他们的代码做了一个例子,对我来说,似乎闭包的行为类似于常规命名方法,它们也“无忧无虑地处理局部变量”并且“所有管道都是自动的” .
或者说这个“局部变量的包装”解决了什么问题让闭包如此特别/有趣/有用?
using System;
namespace TestingLambda2872
{
class Program
{
static void Main(string[] args)
{
Func<int, int> AddToIt = AddToItClosure();
Console.WriteLine("the result is {0}", AddToIt(3)); //returns 30
Console.ReadLine();
}
public static Func<int, int> AddToItClosure()
{
int a = 27;
Func<int, int> func = s => s + a;
return func;
}
}
}
回答
所以这个问题的答案是阅读 Marc 指出的Jon Skeet's article on closures。本文不仅展示了 C# 中 lambda 表达式的演变过程,还展示了 Java 中如何处理闭包,这是本主题的绝佳读物。
【问题讨论】:
-
其他语言(如 Javascript)支持闭包。你问的是概念还是C#的具体实现?
-
我认为这个例子太简单了,无法理解闭包的威力。
-
@strager:我的意思是一般的概念,我试图让我的头脑围绕委托、闭包、映射、lambda、“lambda 表达式”、“lambda 树”、匿名函数、currying、等等,一般来说,似乎超越任何一种语言的函数式编程的新范式,都源于数学等。(我把 C# 放在标题中,因为 Stackoverflow 现在告诉你你的标题“不够好,添加独特的词"...)
-
天啊,C# 4.0 我不知道!谢谢你。