Re: [問題] Closure的問題

看板C_Sharp (C#)作者 (←這人是超級笨蛋)時間10年前 (2015/04/07 22:52), 10年前編輯推噓3(307)
留言10則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《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 獨立 就可以繞過你的問題 -- ╱ ̄ ̄ ̄╲ ▏◢█◣ 成龍表示: 是喔... ′/ ‵ ╰╯ ψQSWEET █◤ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1428418321.A.FC2.html ※ 編輯: uranusjr (218.161.94.175), 04/07/2015 22:53:18

04/07 23:40, , 1F
這個方式我有用過,但是還是會有問題,不知道是否是因為事件
04/07 23:40, 1F

04/07 23:41, , 2F
宣告的關係導致的@@?
04/07 23:41, 2F

04/08 21:23, , 3F
還是試試 var localVariableString = i.toString();
04/08 21:23, 3F

04/08 21:23, , 4F
Console.WriteLine(localVariableString); 看看?
04/08 21:23, 4F

04/10 02:08, , 5F
試試可不可用button本身的id 或tag 屬性去記錄index
04/10 02:08, 5F

04/10 02:08, , 6F
因為button本身是物件, 如果用它自身的屬性去記應該比較
04/10 02:08, 6F

04/10 02:08, , 7F
不會有問題
04/10 02:08, 7F

04/10 02:09, , 8F
我是用winform模擬了 雖然事件宣告建構形式有點差異
04/10 02:09, 8F

04/10 02:10, , 9F
但邏輯差不多 各自button也print出各自的值
04/10 02:10, 9F

05/15 07:14, , 10F
觀念正確,重點是複製保留變數
05/15 07:14, 10F
文章代碼(AID): #1L8-yH_2 (C_Sharp)
討論串 (同標題文章)
本文引述了以下文章的的內容:
1
4
完整討論串 (本文為第 2 之 2 篇):
1
4
文章代碼(AID): #1L8-yH_2 (C_Sharp)