首页 >后端开发 >C++ >c#'s` foreach循环变量可重复使用会导致Lambdas的意外行为吗?

c#'s` foreach循环变量可重复使用会导致Lambdas的意外行为吗?

Barbara Streisand
Barbara Streisand原创
2025-01-31 21:26:09728浏览

Does C#'s `foreach` Loop Variable Reuse Cause Unexpected Behavior with Lambdas?

C# foreach循环变量重用:一个历史遗留问题

在使用Lambda表达式或匿名方法时,C#的foreach循环变量重用可能会导致潜在问题。这种重用会导致“修改后的闭包”问题,其中循环内的所有Lambda表达式都引用变量的最终值,而不是每次迭代期间的当前值。

这种特殊行为的出现是因为循环变量是在循环作用域之外声明的,如下面的代码转换所示:

<code class="language-c#">string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}</code>

尽管有人声称在循环外部声明变量不会带来性能优势,可能只对循环结束后访问它有用,但这种方法由于闭包问题可能导致严重错误。

与for循环不同,for循环的变量作用域在循环体内部,foreach循环的变量会被重用,并且不能在循环外部访问。这种不一致性增加了不必要的错误风险,并使调试变得困难。

虽然这种设计选择可能是在引入Lambda表达式和匿名方法之前做出的,但它并没有被修改,并且仍然会给开发人员带来问题。

C# 5中的重大更改

承认了这个设计缺陷,C# 5引入了一个重大更改来解决它。foreach循环变量现在会在逻辑上作用于循环体内部。这意味着闭包将在每次迭代时捕获变量的新副本,从而消除修改后的闭包问题。

然而,for循环将保持不变,并且更改不会追溯应用于早期C#版本。因此,开发人员在使用带有Lambda表达式或匿名方法的foreach循环时,应继续谨慎操作。

以上是c#'s` foreach循环变量可重复使用会导致Lambdas的意外行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn