以下示例在1秒后打印数字“5”五次。
for (int i = 0; i < 5; ++i)
{
EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}
(假设EasyTime.SetTimeout
的行为类似于JavaScript的setTimeout
)
我们如何在i
周围创建一个闭包,以便让它记住它的回调值?
我知道how to do it in JavaScript但我不确定我们是否可以在C#中以相同的方式执行此操作。
答案 0 :(得分:8)
在块中,将i分配给新变量j,并在lambda中使用j,如下所示:
for (int i = 0; i < 5; ++i)
{
int j = i;
EasyTimer.SetTimeout(() => Console.WriteLine(j), 1000);
}
值得注意的是,这个问题只会出现,因为lambda 是i
的闭包,所以它在lambda执行时得到的值,而不是在它被创建时得到的值。
答案 1 :(得分:2)
如果您使用的是C#5.0,则可以编写以下内容:
foreach (int i in Enumerable.Range(0, 5))
{
EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}
它会自动生成局部变量。这只适用于foreach循环,而不适用于。