关闭时的Foreach变量。 为什么结果不同这些片段?
这个问题在这里已经有了答案:
Resharper给出了这样的描述:“在闭包中访问foreach变量,使用不同版本的编译器编译时可能会有不同的行为。” 为什么它会有不同的行为?
由于foreach中的循环变量受到闭包的影响,C#4和C#5之间出现了一次突破性的变化,特别是在C#3中引入了lambda表达式之后.Resharper警告您这一点,以防您可能依赖或以其他方式已经开始期待以前的语义。
快速结果是,在C#4中,循环变量在循环的每次迭代之间共享,并且闭包捕获变量,所以当它们关闭循环变量时,会导致大多数人意想不到的结果。
在C#5中,循环的每次迭代都获得自己的变量,因此一次迭代中的闭包不会像其他迭代一样关闭相同的变量,从而导致更多的预期结果(对于大多数人)。
这让我们陷入了问题的核心:
在第一个片段中,所有任务都以自己的消息开始,而在第二个任务中,所有任务都以相同的消息开始?
在你的第一个代码片段中,你正在循环中创建一个循环变量的副本,并且闭包发生在内部变量上。 第二,直接关闭循环变量。 据推测,你在C#4下运行,所以前面的语义适用。 如果在C#5中运行,则两个版本的循环输出应该一致。 这是Resharper引用的改变,它还应该让你理解如何在C#4中构建代码(即使用你写的第一个版本)。
正如Justin Pihony在评论中指出的那样,Eric Lippert撰写了一篇非常有用的博客文章,内容涉及前面的语义,也暗示了C#5的变化。
你的第二个代码示例有一个单一的 messageToSend
,其中所有的lambda表达式在其封闭拍摄。
代表运行时,它们使用变量的当前值。
链接地址: http://www.djcxy.com/p/21327.html上一篇: Foreach Variable in Closure. Why Results Differ for These Snippets?