传递静态值

时间:2014-05-16 18:52:45

标签: c#

所以我有一些int x我需要传递给另一个函数,问题是在我使用函数之前x更改,所以值x变为不同于我想要的值。有没有办法复制一个整数(我找不到一个)?这将解决我的问题。

private void Init()
{
    for (int x = 0; x < 10; x++)
    {
        for (int y = 0; y < 10; y++)
        {
            Button tmpButton = new Button();
            tmpButton.Click += (sender, e) => ButtonClick(sender, e, x, y); 
            //x and y need to "freeze" their value at this point
        }
    }
}

private void ButtonClick(object sender, EventArgs e, int x, int y)
{
    Console.Out.WriteLine(x.ToString() + ":" y.ToString());
}

输出:“10:10”

预期输出(如果点击按钮3,4):“3:4”

2 个答案:

答案 0 :(得分:2)

这是一个闭包问题,可以通过使用临时变量

来解决
int localX = x;
int localY = y;

要更好地了解捕获的变量,请参阅Jon Skeet's answer to this SO

答案 1 :(得分:1)

您应该使用临时变量:

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; y++)
    {
        int tempX = x;
        int tempY = y;
        Button tmpButton = new Button();
        tmpButton.Click += (sender, e) => ButtonClick(sender, e, tempX, tempY); 
        //x and y need to "freeze" their value at this point
    }
}

在循环中捕获变量时应始终小心。

基本上,发生的事情是你的lambda正在捕获变量而不是变量的值。因此,当按下按钮时,循环当然已完成,变量的值为10.

Eric Lippert写了great series来解释为什么会这样。