C#问题,动态链接委托中的变量值

时间:2014-02-24 11:39:35

标签: c# delegates

我的游戏中有一个GUI设置代码,例如:

for (int i = 0; i < count; i++)
{
    ...
    Button button = new Button();
    ...
    button.handler = delegate { selectedIndex = i; };
    gui.Add(button);
    ...
}

我想将按钮更改为selectedIndex到当前值i,这是创建它的时间。即button0将其更改为0,button1更改为1,依此类推。但它似乎将代理中的值与i变量进行了dinamycally链接,并且所有按钮都将selectedIndex更改为count + 1。 如何解决?

1 个答案:

答案 0 :(得分:3)

您正在遇到匿名函数中捕获的内容的common problem。您正在代理中捕获i,并且该值会在循环过程中发生变化。

您需要i副本

for (int i = 0; i < count; i++)
{
    int copy = i;
    ...
    Button button = new Button();
    ...
    button.handler = delegate { selectedIndex = copy; };
    gui.Add(button);
    ...
}

请注意,foreach循环在C#4中具有相同的问题,但在C#5中,foreach循环中的迭代变量在每次迭代时都是一个“新”变量。