c#闭包研究(1)

来源:互联网 发布:定时语音播报软件 编辑:程序博客网 时间:2024/06/05 20:34

本人新手,最近想学习闭包,然后看到这样一篇文章


(http://www.cnblogs.com/happyframework/p/3421754.html?utm_source=tuicool)


private static void Before()        {            Action[] actions = new Action[10];            for (var i = 0; i < actions.Length; i++)            {                actions[i] = () =>                {                    Console.WriteLine(i);                };            }            foreach (var item in actions)            {                item();            }        }

然后他的输出 好奇怪



文章中这样提示的


private static void After()        {            Action[] actions = new Action[10];            var anonymous = new AnonymousClass();            for (anonymous.i = 0; anonymous.i < actions.Length; anonymous.i++)            {                actions[anonymous.i ] = anonymous.Action;            }            foreach (var item in actions)            {                item();            }        }        class AnonymousClass        {            public int i;            public void Action()            {                Console.WriteLine(this.i);            }        }

终于明白了

首先,action会创建一个长度为10的数组。

然后微软编译器就会帮我们创建一个匿名类AnonymousClass(名字我猜的,还不懂)里面声明 i 变量,以及输出语句。

然后初始化这个类

for循环里。指定 i 的值,每赋值一个action[ i ] 时,调用AnonymousClass的action方法,这个方法又指向 i 。

所以 就对导致 i = 1,action[ 0 ] = 1  action[ 1 ] = 1

而且 这个过程会等action数组初始化完成的时候才会全部输出,就会出现这种后果。

这个神句真的好神奇,应该是我了解太浅了,先记录下来。

原创粉丝点击