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

  • 相关阅读:
    常见的HTTP状态码(HTTP Status Code)说明
    Java基本数据类型和Integer缓存机制
    面向对象的三大基本特征和五大基本原则
    工程变更(ENGINEERING CHANGE)
    反射
    Redis学习手册(开篇)
    MVC,SSM与三层架构的构成及相互关系
    Java框架篇---Mybatis 入门
    java三大框架介绍
    WEB前端JS与UI框架
  • 原文地址:https://www.cnblogs.com/doujiaomifan/p/4233526.html
Copyright © 2011-2022 走看看