下面的示例在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#中使用相同的方法。
最佳答案
在块内,将i分配给新变量j,然后在lambda中使用j,如下所示:
for (int i = 0; i < 5; ++i)
{
int j = i;
EasyTimer.SetTimeout(() => Console.WriteLine(j), 1000);
}
值得注意的是,此问题只会出现,因为lambda是
i
的闭包,因此它在lambda执行时(而不是在创建时)获得值。
关于c# - 如何在C#中为变量创建闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088593/