ПОНЯТНО О Visual Basic NET (том 3)

       

Области видимости


А теперь поговорим о важном средстве обеспечения удобства и надежности программирования на 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.


    Содержание раздела