我一直在阅读这篇关于闭包的文章,他们说:
- “所有管道都是自动的”
- 编译器“创建一个包装类”并“延长变量的寿命”
- “您可以放心使用局部变量”
- .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;
}
}
}
回答
所以这个问题的答案是阅读Jon Skeet 关于Marc 指出的闭包的文章。本文不仅展示了 C# 中 lambda 表达式的演变,还展示了 Java 中如何处理闭包,这是本主题的优秀读物。