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