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