作者jamod (jasper)
看板C_Sharp
标题[问题] Closure的问题
时间Tue Apr 7 20:37:27 2015
小弟觉得应该是发生Closure的问题吧?
我想在10个按钮上面挂10个触发事件,Code大致上像:
for(int index = 0;index < 10;index++){
btn[index].onClick += () =>
{
Console.WriteLine(index.toString());
};
}
结果10个按钮按下去,都是10...
试了很久都没找到解决方式,目前是采用类似分成10段来写的方法,
但我觉得这应该是很常见的状况,应该有更合理的解决办法吧?
想请问有没有高手能帮我解答一下,非常感谢~
以下附上一段Sample Code:
class Program
{
static Button[] btnArray;
static void Main(string[] args)
{
btnArray = new Button[10];
for (int index = 0; index < 10; index++) {
btnArray[index] = new Button();
btnArray[index].onClick += () =>
{
Console.WriteLine(index.ToString());
};
}
foreach (Button btn in btnArray) {
btn.Click();
}
Console.ReadKey();
}
}
class Button {
public delegate void Del();
public event Del onClick;
public void Click() {
onClick();
}
}
希望的要求是能够列出 1~10,但结果都是10
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.223.20.242
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1428410250.A.08E.html
1F:推 J002: 可以po完整一点的code吗? 04/07 20:53
嗯~目前我手上可能没办法PO出比较完整的code @@
不过onClick在Button的Class中是这样:
public delegate void BtnDel();
public event BtnDel onClick;
※ 编辑: jamod (61.223.20.242), 04/07/2015 20:59:27
2F:→ GoalBased: 你可以写一个sample code 04/07 21:11
※ 编辑: jamod (61.223.20.242), 04/07/2015 21:37:10
3F:→ wenyonba: 你的问题是不是你10个Button的OnClick事件,是要指向同一 04/07 21:40
4F:→ wenyonba: 函式,但是函式内你却不知道是哪个按钮触发了事件???? 04/07 21:41
我是希望btn[0]对应到Console.WriteLine("0");
btn[1]对应到Console.WriteLine("1");
.
.
.
以此类推
但出来的结果是btn[0]对应到Console.WriteLine("10");
btn[1]对应到Console.WriteLine("10");
.
.
.
※ 编辑: jamod (61.223.20.242), 04/07/2015 22:03:54