【问题标题】:C# issue with dynamically linking variable value in delegate在委托中动态链接变量值的 C# 问题
【发布时间】:2014-03-26 01:14:31
【问题描述】:

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

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

我想让按钮将selectedIndex 更改为i 的当前值,这就是它的创建过程。 IE。 button0 将其更改为 0,button1 更改为 1,依此类推。但看起来它会将委托中的值动态链接到i 变量,并且所有按钮都将selectedIndex 更改为count + 1。 如何解决?

【问题讨论】:

标签: c# delegates


【解决方案1】:

您遇到了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 循环中的迭代变量在每次迭代中都是一个“新鲜”变量。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多