为什么在此循环中声明的值类型保留上一次迭代的值?

时间:2018-05-04 21:58:09

标签: vb.net parallel.foreach

第一次在这里发帖提问。对不起,如果标题需要工作。 :)

考虑以下代码(不是原始代码,而是简化版本):

Imports System.Threading.Tasks
Module Module1

Sub Main()
    ' just a sample array to loop in parallel.forEach.
    ' the sample parallel loop does not consume for this demonstration.
    Dim things() As String = {"thing1", "thing2"}

    Dim parallelLoopBody = Sub(s As String)
                               For i As Integer = 1 To 10
                                   Dim j As Integer
                                   For k As Integer = 1 To 10
                                       j += (k * i)
                                   Next
                                   Console.WriteLine(j)
                               Next
                           End Sub

    ' when debugging the original code I set max 1 for easier debugging purposes
    Dim po As New ParallelOptions With {.MaxDegreeOfParallelism = 1}

    Parallel.ForEach(things, po, parallelLoopBody)
End Sub

End Module

这应该产生以下输出,如上所述:

55
165
330
550
825
1155
1540
1980
2475
3025
55
165
330
550
825
1155
1540
1980
2475
3025

但明确声明j = 0并运行代码

55
110
165
220
275
330
385
440
495
550
55
110
165
220
275
330
385
440
495
550

当我逐步完成代码时,我意识到变量j是"保持"循环的最后一次迭代的值。

但我希望j每次都为0,因为它是一个值类型,我在循环体中声明它。

我能够通过明确地将j设置为0来获得我期望的结果。

有人可以解释为什么会这样吗?

0 个答案:

没有答案