c# - 你如何捕获迭代变量?

标签 c# .net for-loop lambda

当您捕获 for 循环的迭代变量时,C# 将该变量视为在循环外声明的一样。这意味着在每次迭代中捕获相同的变量。以下程序写入 333 而不是写入 012:

Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
    actions [i] = () => Console.Write (i);

foreach (Action a in actions) a(); // 333

我正在阅读 C# in a Nutshell(第 5 版),今天我遇到了这个,但我无法理解它,我不明白为什么输出是 333 并且不是 012。是不是因为要打印的 i 的值是循环之后的值?这怎么可能? i 应该在循环之后处理,不是吗?

最佳答案

变量 i 被捕获在 for 循环中,但您这样做有点扩展了它的范围。所以变量保留在它的最后状态,即 3,因此代码输出 333。

另一种编写代码的方法是这样的:

Action[] actions = new Action[3];
int i; //declare i here instead of in the for loop

for (i = 0; i < 3; i++)
    actions [i] = () => Console.Write (i);

//Now i=3
foreach (Action a in actions) a(); // 333

输出和写一样:

Console.Write(i);
Console.Write(i);
Console.Write(i);

关于c# - 你如何捕获迭代变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23857448/

相关文章:

c# - C++ 中的垃圾回收

c# - RestSharp OAuth2 承载身份验证因访问被拒绝而失败

c - c中for循环的一个例子

c# - 如何在 Xamarin.forms 上播放声音?

c# - Win XP(x86) OS 但不是 Win 7(x64) 上的二级属性绑定(bind)异常

c# - 为什么在任何 .csproj 文件中都找不到 <Target Name ="Build">?

c# - 如何在 RESTful .NET WCF Web 服务中返回 XML?

c# - 使用别名 = 类;与泛型

c - 我如何按照 MATLAB 语法编写此 C 代码片段?

javascript - 可以用 for 循环和 InnerHTML 显示数组吗?