gpt4 book ai didi

c# - C# 5.0 中的捕获闭包(循环变量)

转载 作者:IT王子 更新时间:2023-10-29 03:53:20 25 4
gpt4 key购买 nike

这在 C# 5.0 中工作正常(意味着符合预期):

var actions = new List<Action>();
foreach (var i in Enumerable.Range(0, 10))
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();

打印 0 到 9。但是这个显示 10 10 次:

var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();

问题:这是我们在5.0之前的C#版本中遇到的问题;所以我们不得不为闭包使用一个循环本地占位符,它现在在 C# 5.0 中的“foreach”循环中得到了修复。但不是在“for”循环中!

这背后的原因是什么(也没有解决 for 循环的问题)?

最佳答案

What is the reasoning behind this?

我假设你的意思是“为什么它没有为 for 循环也改变?”

答案是对于 for 循环,现有的行为是完全合理的。如果将 for 循环分解为:

  • 初始化器
  • 条件
  • 迭代器
  • 正文

...那么循环大致是:

{
initializer;
while (condition)
{
body;
iterator;
}
}

(当然,iterator 也在 continue; 语句的末尾执行。)

初始化部分逻辑上只发生一次,所以只有一个“变量实例化”是完全合乎逻辑的。此外,在循环的每次迭代中没有变量的自然“初始”值 - 没有什么可以说 for 循环必须是声明变量的形式在初始化器中,在条件中测试它并在迭代器中修改它。您希望这样的循环做什么:

for (int i = 0, j = 10; i < j; i++)
{
if (someCondition)
{
j++;
}
actions.Add(() => Console.WriteLine(i, j));
}

将其与 foreach 循环进行比较,看起来 就像您为每次迭代声明一个单独的变量。哎呀,这个变量是只读的,这使得将它视为一个在迭代之间变化的变量变得更加奇怪。将 foreach 循环视为在每次迭代中声明一个新的只读变量,其值取自迭代器是完全合理的。

关于c# - C# 5.0 中的捕获闭包(循环变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16264289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com