以下示例在1秒后打印数字"5"五次.
for (int i = 0; i < 5; ++i)
{
EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}
Run Code Online (Sandbox Code Playgroud)
(假设EasyTime.SetTimeout表现得像JavaScript一样setTimeout)
我们如何创建一个闭包i,使它能够记住它的回调值?
我知道如何在JavaScript中完成它,但我不确定我们是否可以在C#中以相同的方式执行此操作.
在块内,将i分配给新变量j,并在lambda中使用j,如下所示:
for (int i = 0; i < 5; ++i)
{
int j = i;
EasyTimer.SetTimeout(() => Console.WriteLine(j), 1000);
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,这个问题只会因为lambda 是一个闭包而产生i,因此它在lambda执行时得到的值,而不是在它创建时.