简单的闭包
private static void Main(string[] args)
{
Func<int> a = getFun1();
a(); //输出1
a(); //输出2
}
private static Func<int> getFun1()
{
int b = 1;
return delegate
{
Console.WriteLine(b);
return b++;
};
}
使用ILSpy打开编译后的文件,C#选择1.0 / VS.NET,可以看到如下:
private sealed class <>c__DisplayClass1_0
{
public int b;
internal int <getFun1>b__0()
{
Console.WriteLine(b);
return b++;
}
}
private static void Main(string[] args)
{
Func<int> a = getFun1();
a();
a();
}
private static Func<int> getFun1()
{
<>c__DisplayClass1_0 <>c__DisplayClass1_ = new <>c__DisplayClass1_0();
<>c__DisplayClass1_.b = 1;
return new Func<int>(<>c__DisplayClass1_.<getFun1>b__0);
}
名称有点怪异,不过不太影响阅读(再怪还不是一个名称标识)。
细细看很简单,不解析。
ILSpy 的选择C# 语言的版本很好用,有兴趣可以打开使用async await 的文件,可以看到async的实现原理。