Области видимости
А теперь поговорим о важном средстве обеспечения удобства и надежности программирования на VB – о механизме задания областей видимости переменных, процедур и других элементов VB.
В 11.3 мы уже сталкивались с механизмом задания областей видимости, когда переменные, объявленные внутри процедуры, являлись локальными в процедуре, то есть невидимыми снаружи процедуры. Поэтому их нельзя было использовать в других процедурах модуля. Если вы подзабыли тот раздел, то сейчас перечитайте.
Когда наш проект состоял из единственного модуля формы, рассмотренных ранее областей видимости было достаточно. Теперь, когда наши проекты состоят из нескольких модулей, встает вопрос о видимости переменных, процедур и других элементов VB из других модулей. В предыдущих разделах вы узнали, что для того, чтобы элемент был виден из других модулей, достаточно объявить его не словом Dim, а словом Public. В принципе, мы уже многое знаем, остается дополнить наши знания и изложить их систематически.
В нижеприведенном примере вы видите варианты объявлений переменных, констант, процедур и функций в типичном модуле. Пояснения ниже.
Public Class Class1
Dim C As Integer
Public
A As Integer
Private
B As Integer
Const M As Integer = 3
Public Const
K As Integer = 1
Private
Const L As Integer = 2
Private Sub
Проц()
Dim
C1 As Integer
End Sub
Sub Проц1()
Const
L1 As Integer = 4
End Sub
Public Function Функц() As String
Static
D As Integer
Return "Привет"
End Function
End Class
Мы различаем области видимости 5 уровней (в порядке увеличения охвата):
- Блок внутри процедуры или функции
- Процедура или функция
- Модуль
- Проект
- Неограниченная область (элемент виден из своего и из других проектов)
Последний случай актуален тогда, когда проект во время своей работы взаимодействует с другими проектами и должен видеть некоторые их элементы.
Сделаем выводы из увиденного в примере и рассмотрим области видимости, начиная с самой узкой и кончая самой широкой.
Локальные переменные и константы. Тем, в какой области будет виден тот или иной элемент, мы можем управлять при помощи так называемых модификаторов доступа. Модификаторов доступа всего 5: Public,
Private, Protected,
Friend, Protected Friend. Кроме этого используется слово Dim.
Внутри процедур и функций переменные могут быть объявлены только при помощи знакомых нам слов Dim и Static, а константы только при помощи слова Const. Это знакомые нам блочная и локальная области видимости и знакомые нам локальные переменные и константы. Они видны только в той процедуре, функции или блоке, в которых объявлены.
Теперь поговорим об элементах, объявленных вне процедур и функций. Это и переменные, и константы, и процедуры, и функции, и модули. Их царство – три нижние области видимости. Они могут быть видны или только в том модуле, где они объявлены (независимо от того, насколько глубоко он угнездился внутри других модулей), или во всем проекте, или в неограниченной области в зависимости от того, при помощи каких слов это было сделано. Конкретно:
Область видимости – модуль. Слова Dim или Private для переменной и слова Const или Private Const для константы делают их видимыми только в своем модуле. Их область видимости – весь этот модуль, включая все процедуры, функции и другие модули (если они есть) внутри модуля. Это модульные переменные и константы.
Обратите внимание, что здесь можно было бы обойтись и без модификатора Private. Но английский смысл слова Private («частная собственность», «вход запрещен») лучше подходит к случаю, поэтому программисты в основном используют его.
Любой другой элемент (процедура, функция, модуль), чтобы быть видимым аналогичным образом только в своем модуле, объявляется модификатором Private.
Область видимости – проект, но не дальше. Если мы хотим, чтобы элемент VB был виден во всем проекте, но не дальше, мы объявляем его модификатором Friend. Часто программистам все равно – дальше или не дальше, и поэтому они употребляют вместо Friend более привычный модификатор Public, обеспечивающий неограниченную видимость
Неограниченная область видимости. Модификатор Public делает элемент неограниченно видимым. Часто такие элементы называют глобальными.
Видимость по умолчанию. Если вы совсем уберете модификатор доступа к классам, структурам и модулям:
Class Класс1
End Class
они по умолчанию будут иметь доступ Friend.
Если вы совсем уберете модификатор доступа к процедуре или функции:
Sub П4()
End Sub
она по умолчанию будет иметь доступ Public.
Птичка в клетке. Имейте в виду, что элементу с неограниченной областью видимости не гарантирована эта неограниченная видимость, если он объявлен внутри элемента с ограниченной видимостью. Рассмотрим пример:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Класс.Структура.П4()
End Sub
End Class
Public Class Класс
Public Structure Структура
Dim a As Integer
Public Shared Sub П4()
Debug.WriteLine("Сработала процедура П4 структуры Структура класса Класс")
End Sub
End Structure
End Class
Здесь процедура П4 имеет неограниченную область видимости. Но стоит нам в строке
Public Structure Структура
заменить Public на Private – и эта процедура вместе со всей структурой и ее компонентами станет недоступной из класса Form1. (На слово Shared пока не обращайте внимания.)
Область видимости – классы-наследники. Есть еще одна область видимости, которая не совпадает ни с одной из упомянутых и имеет отношение к наследованию классов. К ней относятся модификаторы Protected и Protected Friend. О Protected вы узнаете в 22.7.