C# 闭包

1、解决的问题:

先看例子,

1        private Action CreateFunction()
2         {
3             string str = "I am Andy";
4 
5             return () =>
6                 {
7                     Console.WriteLine(str);
8                 };
9         }
1             Action action = CreateFunction();
2             action();

在委托实例中,访问str,从作用域来看,没问题。从生命周期看,方法执行完后,str就会被释放。理论上讲,访问str会出错。

补充:堆保存对象,栈记录程序执行的过程,方法执行完毕,释放局部对象。

2、为了解决上面的问题,编译器做了手脚,将用到的str保存到委托对象的Target属性中,这样就延长了str的生命周期。

说明:这个Target是方法的拥有者,也就是观察者,Target中只有str属性,没有观察者的其他字段和方法。

posted on 2013-09-17 13:40  Andy Niu  阅读(799)  评论(0编辑  收藏  举报