闭包的本质就是 有权访问另一个函数中变量的函数。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetClosureFunction()(30));
}
static Func<int, int> GetClosureFunction()
{
int val = 10;
Func<int, int> internalAdd = x => x + val;
Console.WriteLine(internalAdd(10));
val = 30;
Console.WriteLine(internalAdd(10));
return internalAdd;
}
}
反编译后的效果是:编译器将闭包函数和临时变量作为匿名类处理。
class Program
{
sealed class DisplayClass
{
public int val;
public int AnonymousFunction(int x)
{
return x + this.val;
}
}
static void Main(string[] args)
{
Console.WriteLine(GetClosureFunction()(30));
}
static Func<int, int> GetClosureFunction()
{
DisplayClass displayClass = new DisplayClass();
displayClass.val = 10;
Func<int, int> internalAdd = displayClass.AnonymousFunction;
Console.WriteLine(internalAdd(10));
displayClass.val = 30;
Console.WriteLine(internalAdd(10));
return internalAdd;
}
}
另外,作为C#7,多了一个本地函数,可以代替匿名函数,在性能上,本地函数会被创建成一个结构体,匿名函数会被创建成类,结构体在执行完后,由系统自动回收,类在堆上,由GC回收,所以本地函数性能更好。