使用C# delegate的一种误区场景
一个小弟特别喜欢使用delegate写代码。有一天他写了如下一段代码:
1 Action[] action = new Action[6];
2 for (int i = 0; i < action.Count(); i++)
3 {
4 action[i] = () => Console.WriteLine(i);
5 }
6 foreach (Action a in action)
7 {
8 a();
9 }
10
这段代码目的是想打印0到5,但是实际结果是
通过反汇编调试,可以简单地说:delegate存的仅仅是变量 i 的地址,所有的delegate当调用的时候都是到同一地址取值,于是经过6次循环, i已经变成6,所以打印出来全是6。
对于普通程序员来说,我觉得这是挺容易出错的,得不到期望值,而且不容易发现。
一个简单解决方法:
1 Action[] action = new Action[6];
2 for (int i = 0; i < action.Count(); i++)
3 {
4 int j = i;
5 action[i] = () => Console.WriteLine(j);
6 }
7 foreach (Action a in action)
8 {
9 a();
10 }
11