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