码迷,mamicode.com
首页 > 其他好文 > 详细

委托、Lambda表达式、事件系列05,Action委托与闭包

时间:2014-10-02 11:41:52      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   使用   ar   strong   

来看使用Action委托的一个实例:

        static void Main(string[] args)
        {
            int i = 0;
            Action a = () => i++;
            a();
            a();
            Console.WriteLine(i);
        }

bubuko.com,布布扣

结果是期望能的2。但令人好奇的是:栈上的变量i是如何传递给Action委托的?

 

反编译进行查看,首先看Main方法对应的IL代码:

bubuko.com,布布扣

 

再看c_DisplayClass1的IL代码:

bubuko.com,布布扣

从中可以看出:
→在托管堆上创建了一个名为c_DisplayClass1的实例
→把栈上变量i的值赋值给了c_DisplayClass1的实例字段i
→编译器() => i++;Lambda表达式表示的匿名委托起了个<Main>b_0的方法名,并成为了c_DisplayClass1的实例方法
→把c_DisplayClass1的实例方法<Main>b_0赋值给Action委托变量
→最后调用委托2次,这2次都是针对c_DisplayClass1的实例字段i

 

换句话说,在托管堆上创建了对象实例,形成"闭包"。栈上的变量变成了闭包的实例字段,Lambda表达式所表示的匿名委托变成了闭包的实例方法。

 

以上,创建了一个Action,形成了一个"闭包",接下来创建2个Action,形成2个"闭包",看"闭包"的实例字段是否相互影响?

        static void Main(string[] args)
        {
            Action a = GetAction();
            Action b = GetAction();
            Console.Write("第一次调用a,i的值=");
            a();
            Console.WriteLine();
            Console.Write("第二次调用a,i的值=");
            a();
            Console.WriteLine();
            Console.Write("第一次调用b,i的值=");
            b();
            Console.WriteLine();
        }
        static Action GetAction()
        {
            Action result = null;
            int i = 0;
            result = () => Console.Write(i++);
            return result;          
        }

bubuko.com,布布扣

以上,虽然是把同一个GetAction方法分别赋值给了Action委托,但GetAction方法分别在不同的"闭包"内,当调用委托执行GetAction方法的时候,各自对闭包内的实例字段i自增1并打印,相互间不影响。

 

总结:每个Action都有自己的"闭包",并且"闭包"间互不影响。

 

“委托、Lambda表达式、事件系列”包括:

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托、Lambda表达式、事件系列02,什么时候该用委托

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

委托、Lambda表达式、事件系列05,Action委托与闭包

委托、Lambda表达式、事件系列05,Action委托与闭包

标签:style   blog   http   color   io   os   使用   ar   strong   

原文地址:http://www.cnblogs.com/darrenji/p/4003876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!