日期:2014-05-18  浏览次数:20809 次

【菜鸟求解惑】关于委托的执行结果的困惑
本来写了一个测试例子,向测试下多播委托的执行顺序的,没想到在执行过程中出现了另一个问题,
先上代码,测试代码如下:
C# code


static void Main(string[] args)
        {
            Action funcTemp = null;
            int i =1;
            for (; i <= 20; i++)
            {
                funcTemp += delegate()
                {
                    int temp = i;
                    Console.WriteLine("--> " + temp.ToString());
                };
                Console.Write(i + "_");//在这里输出的i的值正常。
            }
            Console.WriteLine("\n--> 按任意键继续......");
            Console.ReadKey();

            Console.WriteLine("--> Begin <--");
            funcTemp();//在执行委托的时候出问题了。
            Console.WriteLine("-->  End  <--");

            Console.ReadKey();
        }




执行结果截图:


委托执行了20次,但是每次的输出结果却都是 21 ,

我想得到的结果本来是 1 到 20 的,只这样呢??

我以前曾经看到过一个贴字说可能是因为闭包的原因,造成这样的错误,但是当时看的时候也没在意,现在再找那个帖子的时候却找不到了,请好心人 帮我解释一下,还有应该怎么改正呢??



------解决方案--------------------
将 声明临时变量 放到委托外面
C# code

for (; i <= 20; i++)
            {
[color=#FF0000] int temp = i;[/color]

                funcTemp += delegate()
                {
                                       Console.WriteLine("--> " + temp.ToString());
                };
                Console.Write(i + "_");//在这里输出的i的值正常。
            }

------解决方案--------------------
探讨
能解释下原因吗??

------解决方案--------------------
探讨

为什么啊,SP大哥,别只说一句啊。

我菜鸟,很多都不明白的.为什么私有变量 就可以了呢??

难道和他的生存周期有关?

如果和生存周期有关的话,那能不能具体的解释下呢?

引用:

引用:
能解释下原因吗??


必须使用私有变量(因为私有值),而不是共享一个变量。

------解决方案--------------------
上边有个提到的"closure" 不知道是啥东西 
下面是给出的链接
The Beauty of Closures