深入理解 c# 第五章 捕获不同作用域的变量 警告:前面的代码糟糕

 
    class EvilEvilEvilCapturedVariables
    {
        static void Main()
        {
            MethodInvoker[] delegates = new MethodInvoker[2];

            int outside = 0;                                     //只实例化一次  

            for (int i=0; i < 2; i++)
            {
                int inside = 0;             //每次循环迭代,都要实例化一次 实例化很多次                       

                delegates[i] = delegate //使用匿名方法捕获变量  
                只是创建,并没执行  outside变量两个委托共享 inside变量各自分配                      
               {
                    Console.WriteLine ("({0},{1})",
                                       outside, inside);
                    outside++;
                    inside++;
                };
            }

            MethodInvoker first = delegates[0]; //委托0
            MethodInvoker second = delegates[1]; //委托1

            first(); //执行委托 inside 和 outside都是0  捕获的outside=1 inside=1
            first(); //执行委托 outside 和 inside 都是1  执行完outside=2 inside=2
            first();  //执行委托 outside 和 inside 都是2 执行玩 outside=3 inside=3 

            second();  //outside=3保留了  inside=0重新初始化  执行完 outside =4 inside=1
            second();  //outside=4 保留 inside=1 保留  执行玩outside=5 inside =2
        }
    }



编译器如何实现  生成一个额外的类,包含外部变量 outside,还生成一个额外的类,包含内部变量(inside)和对第一个额外的类的引用。就是一个inside变量,一个outside变量的指针

输出

(0,0)
(1,1)
(2,2)
(3,0)
(4,1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值