Почему тип значения, объявленный в этом цикле, сохраняет значение из предыдущей итерации? - PullRequest
0 голосов
/ 05 мая 2018

Впервые отправив вопрос здесь. Извините, если название требует работы. :)

Рассмотрим следующий код (не оригинальный код, а упрощенная версия):

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.

Может кто-нибудь объяснить, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...