zoukankan      html  css  js  c++  java
  • 捕获变量

    1.认识捕获变量

            static void Main(string[] args)
            {
                Action action = CaptureVariable();
                action();
            }
            static Action CaptureVariable()
            {
                int flag = 0;
                Action action = () =>
                {
                    flag++;
                    Console.WriteLine("flag=" + flag);
                };
                flag = 100;
                action();
                return action;
            }
    

      

    可以看出委托实例action内和action外都可以修改flag的值,是同一个flag变量,flag的作用域跟随委托实例action

    2.捕获变量实现原理——没有捕获变量

            static void Main(string[] args)
            {
            }
            static Action CaptureVariable()
            {
                int flag = 0;
                Action action = () =>
                {
                    Console.WriteLine("");
                };
                return action;
            }
    

     

    ——捕获flag变量

            static void Main(string[] args)
            {
            }
            static Action CaptureVariable()
            {
                int flag = 0;
                Action action = () =>
                {
                    Console.WriteLine(flag);
                };
                return action;
            }
    

      

     如上图,编译时会在当前类内部新建一个类"<>c_DisplayClass0"维护变量flag

    3.捕获两个变量(一个共享一个非共享)

            static void Main(string[] args)
            {
                List<Action> actionList = CaptureVariable();
                foreach (var action in actionList)
                {
                    action();
                }
            }
            static List<Action> CaptureVariable()
            {
                List<Action> list = new List<Action>();
                int flag = 0;
                for (int i = 0; i < 5; i++)
                {
                    int flag2 = 0;
                    Action action = () =>
                    {
                        flag++;
                        flag2++;
                        Console.WriteLine("flag=" + flag + "  flag2=" + flag2);
                    };
                    list.Add(action);
                }
                return list;
            }
    

      

    捕获两个变量,会创建两个类来维护两个变量

    运行结果:

    flag是5个委托实例共享一个变量,flag2是每个委托各自有各自的flag2

  • 相关阅读:
    Nodejs 开发指南 Nodejs+Express+ejs 开发microblog开发心得
    转载 java学习注意点
    STM32f103的数电采集电路的ADC多通道采集程序
    时间复杂度与空间复杂度
    RS232串口通信详解
    实现扫码登录
    TCP/UDP区别与联系
    Tcp三次握手/四次挥手
    浅谈CSRF攻击方式
    图片淡入淡出
  • 原文地址:https://www.cnblogs.com/doujiaomifan/p/4233526.html
Copyright © 2011-2022 走看看