如何在C#中为变量创建闭包?

时间:2012-12-30 05:38:11

标签: c# closures

以下示例在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#中以相同的方式执行此操作。

2 个答案:

答案 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循环,而不适用于。