【发布时间】:2014-02-19 19:46:23
【问题描述】:
进入以下教程:http://www.albahari.com/threading/
他们说下面的代码:
for (int i = 0; i < 10; i++)
new Thread (() => Console.Write (i)).Start();
是不确定的,可以产生以下答案:
0223557799
我认为当使用 lambda 表达式时,编译器会创建某种匿名类,通过在捕获类中创建类似的成员来捕获正在使用的变量。
但是i是值类型,所以我认为他应该按值复制。
我的错误在哪里?
如果答案能解释闭包是如何工作的,它如何持有指向特定 int 的“指针”,在这种特定情况下会生成什么代码,那将非常有帮助?
【问题讨论】:
-
在 C# i,而不是循环体中的当前值。我相信 C#5 会改变这种行为并改为捕获当前值,因此
i将始终具有不同的值。 -
您希望捕获
i的哪个值?试试for (int i=0;i<10;i++){int j=i;new Thread(()=>Console.Write(j)).Start();} -
@Lee 这是错误的。闭包语义没有任何改变。在每一个 C# 版本中,闭包都关闭了变量,而不是值(当然,闭包在 1.0 中根本不存在,但是每个有闭包的版本都有相同的语义)。
-
@Lee - C# 5 中的变化特别针对
foreach迭代变量。for完全没有改变。