Re: [问题] Closure的问题

楼主: uranusjr (←這人是超級笨蛋)   2015-04-07 22:51:58
※ 引述《jamod (jasper)》之铭言:
: 小弟觉得应该是发生Closure的问题吧?
: 我想在10个按钮上面挂10个触发事件,Code大致上像:
: for(int index = 0;index < 10;index++){
: btn[index].onClick += () =>
: {
: Console.WriteLine(index.toString());
: };
: }
: 结果10个按钮按下去,都是10...
for (int i = 0; i < 10; i++) {
int localVariable = i;
btn[i].onClick += () => {
Console.WriteLine(localVariable.toString());
};
}
这里的问题是因为你只宣告了一个 index
所有的 closures 都会 capture 到同一个变量, 而这个变量又是 loop index
当 i++ 时, 所有 closures 都会被影响(因为它们使用的变量是同一个东西)
解法就是为每一个 closure 宣告一个 local variable 来 capture
在这里, 等于每个 iteration 都会把 loop index 复制一份
所以每个 closure capture 到的变量会是独立的, 也与 loop index 独立
就可以绕过你的问题
作者: jamod (jasper)   2015-04-07 23:40:00
这个方式我有用过,但是还是会有问题,不知道是否是因为事件宣告的关系导致的@@?
作者: J002 (阿里山 我来了XD~)   2015-04-08 21:23:00
还是试试 var localVariableString = i.toString();Console.WriteLine(localVariableString); 看看?
作者: pkmu8426 (巴426)   2015-04-10 02:08:00
试试可不可用button本身的id 或tag 属性去记录index因为button本身是物件, 如果用它自身的属性去记应该比较不会有问题我是用winform模拟了 虽然事件宣告建构形式有点差异但逻辑差不多 各自button也print出各自的值
作者: tomex (Tomex Ou)   2015-05-15 07:14:00
观念正确,重点是复制保留变量

Links booklink

Contact Us: admin [ a t ] ucptt.com