1

以下示例在 1 秒后五次打印数字“5”。

for (int i = 0; i < 5; ++i)
{
    EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}

(假设EasyTime.SetTimeout行为类似于 JavaScript 的setTimeout

我们如何创建一个闭包i,让它记住回调的值?

我知道如何在 JavaScript 中做到这一点,但我不确定我们是否可以在 C# 中以同样的方式做到这一点。

4

2 回答 2

8

在块内部,将 i 分配给一个新变量 j,并在 lambda 中使用 j,如下所示:

for (int i = 0; i < 5; ++i)
{
    int j = i;
    EasyTimer.SetTimeout(() => Console.WriteLine(j), 1000);
}

值得注意的是,这个问题只是因为 lambda一个闭包而出现的i,所以它在 lambda 执行时获取值,而不是在创建时获取值。

于 2012-12-30T05:40:04.477 回答
2

如果您使用的是 C#5.0,您可以编写以下代码:

foreach (int i in Enumerable.Range(0, 5))
{
    EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}

它会自动生成局部变量。这仅适用于 foreach 循环,不适用于 for。

于 2012-12-30T09:55:34.323 回答