Область видимости – блок
Блоком называется последовательность всех выполняющихся друг за другом операторов. Если вы помните, эти операторы легко узнать, так как у них одинаковый отступ от левого края окна. Блоки могут входить внутрь других блоков. Рассмотрим бессмысленную программу:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim a, b, c As Integer
b = 6
For a = 5 To 6
b = 8
c = 2 * 2
Next
a = 1
If a > 0 Then
a = 7
c = 5 * 5
a = 8
End If
a = 3
End Sub
Все тело процедуры есть блок из 5 операторов:
b = 6
For . . .
a = 1
If . . .
a = 3
Внутрь этого блока входят два блока. Один есть содержимое оператора For:
b = 8
c = 2 * 2
Другой – содержимое оператора If:
a = 7
c = 5 * 5
a = 8
Если бы внутрь этих двух блоков входили сложные операторы, то операторы, из которых состоят эти сложные операторы, тоже составляли бы блоки, входящие в упомянутые. Матрешка.
Оказывается, целесообразно иметь области видимости меньшие, чем процедура. Это блоки.
Зачем они могут понадобиться? Ну, например, мы видим, что в нашем примере переменная c в каждом блоке делает «важные» дела, причем в каждом блоке свои. Мы опасаемся, как бы при дальнейшей доработке программы значения переменной c из одного блока при нашей невнимательности не повредили бы значения переменной c из другого блока. Что делать для спокойствия? Уберем объявление c из начала процедуры и объявим переменную c внутри каждого блока:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim a, b As Integer
b = 6
For a = 5 To 6
Dim c As Integer
b = 8
c = 2 * 2
Next
a = 1
If a > 0 Then
Dim c As Integer
a = 7
c = 5 * 5
a = 8
End If
a = 3
End Sub
Теперь мы имеем в процедуре две совершенно независимые переменные, имеющие одинаковое имя c. Каждая из них создается и инициализируется в момент, когда компьютер заходит в ее блок. Она живет и работает, пока работает блок. Когда же компьютер выходит из блока, переменная уничтожается вместе со своим значением.
Только не вздумайте объявлять переменную, имеющую то же имя, в начале процедуры, то есть в ее главном блоке. VB не допускает, чтобы одноименные переменные объявлялись в охватываемом и охватывающем блоках.
У констант тоже существует область видимости блок.