переменная, объявленная в цикле, сохраняет значение в течение каждой итерации цикла



Я не мог понять, является ли это ошибкой или функцией

For i = 0 To 4
    Dim strTest As String
    If i = 0 Then
        strTest = "test value"
    End If
    Console.WriteLine(strTest)
Next

Я думал, что, объявив строку внутри цикла, она не будет сохранять свое значение, но после выполнения этого кода консоль имеет 5 строк "тестового значения". Если вместо этого я объявляю strTest следующим образом:

Dim strTest As String= ""

Тогда строка не сохраняет свое значение - именно так я ожидал бы, что функция будет работать в первую очередь.

Является ли это намеренным поведением компилятора?

141   2  

2 ответов:

"сломано, как задумано"

Http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

Примечание даже если область действия переменной ограничена блоком, ее продолжительность жизни-это все еще продолжительность всей процедуры. Если вы входите в блок более одного раза во время процедуры каждая блочная переменная сохраняет свою предыдущее значение. Чтобы избежать неожиданных результатов в таком случае, это мудро инициализация переменных блока в начале блока.

" блок" вот тело, если за петлю, и вы входите в него один pr. итерация цикла. Таким образом, strTest сохранит значение, заданное в первой итерации ("тестовое значение") для следующих итераций (1, 2, 3, 4).

Это хорошо заданное поведение. Из раздела 10.9 спецификации VB 11:

Каждый раз, когда вводится тело цикла, создается новая копия всех локальных переменных, объявленных в этом теле, инициализированная предыдущими значениями переменных. Любая ссылка на переменную в теле цикла будет использовать самую последнюю сделанную копию.

Обратите внимание, что тот факт, что это "свежая копия", потенциально важен, если используются любые лямбда-выражения, которые захватывают локальную переменная. Из дальнейшего в том же разделе:

И когда создается лямбда, она запоминает, какая копия переменной была текущей в момент ее создания.

(есть пример, который проясняет это.)

    Ничего не найдено.

Добавить ответ:
Отменить.