class CapturedVariableLifetimeExtension
{
static MethodInvoker CreateDelegateInstance()
{
int counter = 5;
MethodInvoker ret = delegate
{
Console.WriteLine(counter); //先输出5,之后6,之后7
counter++;
};
ret(); //执行ret方法
return ret;
}
static void Main()
{
MethodInvoker x = CreateDelegateInstance(); //执行CreateDelegateInstance函数
x(); //直接调用匿名方法
x();
}
}
方法返回之后,一般认为变量会被销毁,但没被销毁
counter 不是在栈上,编译器创建了一个额外 的类来容纳变量
CreateDelegateInstance 方法 拥有对 类的实例引用,所以可以使用counter,委托也有对counter的引用,实例在堆上,除非委托被垃圾回收了,否则实例不会被回收的
输出
5
6
7