Видимость и правила доступа для переменных и объектов
Область действия переменной относится к ее видимости в программе. Переменная
не видна (не может быть доступна) , если она выходит за рамки области, в
которой она был продекларирована. Где и как переменная продекларирована
определяет ее область видимости.
В
Freebasic 4 категории области видимости:
local,
shared,
common
и
common shared. Каждая из этих областей имеет свои правила
видимости, которые подробно описаны ниже.
Локальная область видимости (local)
Переменные, продекларированные в локальной области видны только в самих
локальных областях как IF, FOR, SCOPE, FUNCTION или в блоке модуля, в
котором они продекларированы.
- Sub, Function,
тело main и каждый составной оператор неявно
определяют новый блок локальной области.
- Явно объявленные переменные, с помощью операторов Dim
или ReDim берут локальную область, в
которой они продекларированы.
- Неявные переменные принимают локальную область Scope...End Scope,
в котором они впервые начали использоваться, в противном случае принимают
области Sub, Function,
или main, в котором они используются.
В локальной области нет никакой видимости между кодом уровня модуля и кодом
уровня функции. Кроме того, переменные, которые являются частью цикла будут
видны только в блоке цикла. Переменные, объявленные в локальной области
модуля не видны в любой из функций этого модуля. Аналогичным образом
локальные переменные, объявленные внутри функции не видны в коде уровня
модуля, так же как и не видны в любой другой функции в пределах модуля.
Переменные, объявленные внутри блоков
Scope
видны только в нем и не видны вне его. Однако блок
Scope
наследует окружающий
Scope, поэтому
локальные переменные, объявленные вне внутреннего блока
Scope
будут видны в нем (см. пример программы).
Вы можете объявить переменную для локальной области видимости явно с помощью
инструкции
Dim, или неявно(см.
Неявная декларация). Пример
программы
local.bas демонстрирует правила видимости для
локальной области видимости.
local.bas
'' видна только в этом модуле
Dim As Integer local_moduleLevel1
'' OK.
Print local_moduleLevel1
Scope
'' OK; SCOPE блок наследует внешнюю область
видимости(scope)
Print local_moduleLevel1
'' видна только в этом блоке SCOPE
Dim As Integer local_moduleLevel2
'' OK.
Print local_moduleLevel2
End Scope
'' Ошибка; не видна будет
данная переменная из прошлого блока
Scope
'' print local_moduleLevel2
Function some_function( ) As Integer
'' видна только в этой функции
Dim As Integer local_functionLevel
'' OK.
Print local_functionLevel
'' Ошибка; не видна будет
данная переменная из основной
области видимости уровня модуля
'' print local_moduleLevel1
'' Ошибка; не
видна будет данная переменная из
области видимости Scope
'' print local_moduleLevel2
Function = 0
End Function
'' print local_functionLevel '' Ошибка; не
видна будет данная переменная из области видимости
функции
End 0
Глобальная область видимости (Shared)
Переменные, объявленные в глобальной (
shared)
области модуля видны модулем и всеми функциями этого модуля.
В отличие от локальной области, глобальные области делают переменные
видимыми для функций этого модуля. Другими словами модуль разделяет свои
заявления с его функциями.
Глобальные переменные могут быть объявлены только в глобальной области на
уровне модуля. То есть их нельзя объявлять в локальных областях вроде
функций или блоках
Scope.
Можно объявить переменную с помощью оператора DIM с ключевым словом
Shared
из глобальной области. Пример программы
shared_scope.bas
демонстрирует правила видимости для глобальной области.
shared.bas
'' видна во всем этом модуле
Dim Shared As Integer shared_moduleLevel1
'' OK.
Print shared_moduleLevel1
Scope
'' OK; можно видеть переменные внешней
области
Print shared_moduleLevel1
'' Ошибка; Нельзя создавать глобальные
переменные в блоке Scope
'' dim shared as integer shared_ModuleLevel2
End Scope
End 0
Function some_function( ) As Integer
'' OK; можно
видеть переменные глобальной области
Print shared_moduleLevel1
'' Ошибка; Нельзя создавать глобальные
переменные в функции
'' dim shared as integer sharedFunctionLevel
Function = 0
End Function
Общая область видимости (Common)
Переменные, объявленные в общей области являются видимыми для всех модулей.
Переменные, объявленные с
Common
могут видеть другие модули с соответствующими
Common
декларациями переменной. Имя декларированной переменной должно совпадать
между модулями.
module1.bas
'' Компилировать:
'' fbc -lang qb module1.bas module2.bas
'$lang: "qb"
Declare Sub Print_Values()
Common m1 As Integer
Common m2 As Integer
' Это
выполняется после всех остальных модулей
m1 = 1
Print "Module1"
Print "m1 = "; m1 ' m1 = 1 как
установлено в этом модуле
Print "m2 = "; m2 ' m2 = 2 как
установлено в module2
Print_Values
module2.bas
Common m1 As Integer
Common m2 As Integer
m2 = 2
Print "Module2" ' Это
выполняется первым
Print "m1 = "; m1 ' m1 = 0 (по
умолчанию)
Print "m2 = "; m2 ' m2 = 2
Sub Print_Values()
Print "Module2.Print_Values"
Print "m1 = "; m1 ' Неявная
переменная = 0
Print "m2 = "; m2 ' Неявная
переменная = 0
End Sub
Вывод:
Module2
m1 = 0
m2 = 2
Module1
m1 = 1
m2 = 2
Module2.Print_Values
m1 = 0
m2 = 0
Общая глобальная область видимости
(Common Shared)
Переменные, объявленные в глобальной общей области, видны во всех
модулях и во всех функциях этих модулей.
Переменные, объявленные с
Common
могут видеть другие модули с соответствующими
Common
декларациями переменной. Имя декларированной переменной должно совпадать
между модулями. Спецификатор
Shared
создает видимость для декларированной с
COMMON SHARED
переменной для всех процедур и функций.
module3.bas
'' Компиляция:
'' fbc module3.bas module4.bas
Declare Sub Print_Values()
Common m1 As Integer
Common m2 As Integer
'' Это выполняется после всех других модулей
m1 = 1
Print "Module3"
Print "m1 = "; m1 '' m1 = 1 как
установлено в этом модуле
Print "m2 = "; m2 '' m2 = 2 как
установлено в module2
Print_Values
module4.bas
Common Shared m1 As Integer
Common Shared m2 As Integer
m2 = 2
Print "Module4" '' Это
выполняется первым
Print "m1 = "; m1 '' m1 = 0 (по
умолчанию)
Print "m2 = "; m2 '' m2 = 2
Sub Print_Values()
Print "Module4.Print_Values"
Print "m1 = "; m1 '' m1 = 1
Print "m2 = "; m2 '' m2 = 2
End Sub
Вывод:
Module4
m1 = 0
m2 = 2
Module3
m1 = 1
m2 = 2
Module4.Print_Values
m1 = 1
m2 = 2
Пример
См. примеры выше.
См. также