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

标签 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#中使用相同的方法。

最佳答案

在块内,将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/

相关文章:

c# - Page.IsPostBack 的安全实现?

c# - 如何仅在添加范围内将 Func Of T, Bool 的表达式添加到列表?

javascript - asp.net 将 javascript ajax 发送到用户控件

c# - 从 C# 项目创建 WSDL

javascript - 从链接 onclick 将参数传递给 JS 函数

javascript闭包局部变量超出范围?

javascript - 在 javascript 的父闭包中引用 "this"

c# - IIS 7.x,添加启用 HTTPS 的站点 : SiteCollection. Add(string, string, string, byte[]) 重载

IOS/objective-c : Return value from completion block or closure asynchronously to calling function

c++ - C++ 中的 Lambda <-> 闭包等价