Static
 
Определяет переменные, объекты и массивы, имеющие статическую память

Синтаксис

Static symbol [ (array-dimensions) ] As DataType [, ...]

or

Type typename
Static symbol [ (array-dimensions) ] As DataType [, ...]
...
End Type
Dim typename.symbol [ (array-dimensions) ] As DataType [= initial-value] [, ...]

or

Sub|Function procedurename ( parameters ) [As DataType] Static
...
End Sub|Function

Параметры

symbol
Символьное имя переменной или массива.
array-dimensions
lower-bound To upper-bound [, ...]

Описание

Определяет статическую память для переменных, объектов и массивов; память выделяется при запуске программы и освобождается после выхода. Объекты создаются когда они определены и уничтожаются при выходе из программы.

При объявлении статических массивов, только числовые литералы, константы или перечисления могут использоваться в качестве подстрочного диапазона значений. Статические массивы переменной длины должны быть объявлены пустыми (без списка индексов диапазона) и размеряться с помощью ReDim ранее.

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

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

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

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

При использовании UDT, каждая Static переменная-элемент должна четко определяться, а также декларироваться. Декларация внутри UDT является прототипом, который является видимым для каждого модуля, видя объявление UDT (как с методами). Определение - что должно быть сделано вне кода объявления типа, и только один раз в одном модуле - выделяет статическое пространство и, возможно, инициализирует статическую переменную.
Static переменная-элемент видна на протяжении всей программы (внутри любой процедуры), даже если модификатор Shared не указан в определении (Static и Shared бесполезны в определении). Так, Static переменные-элементы могут быть вызваны непосредственно в любом месте в коде или на объектах типа typename.

Static (элемент) также используется в описаний процедур-элементов для указания статических процедур-элементов.

Пример

Sub f
    '' статические переменные инициализируются 0 по умолчанию
    Static i As Integer
    i += 1
    Print "Number of times called: " & i
End Sub

'' статическая переменная в f() сохраняет свое значение между
'' множественными вызовами процедур.
f()
f()

Вывод:

Number of times called: 1
Number of times called: 2

'присваивание уникального ID на каждый случай Типа (ID, увеличивается в порядке создания)

Type UDT
  Public:
    Declare Property getID () As Integer
    Declare Constructor ()
  Private:
    Dim As Integer ID
    Static As Integer countID
End Type
Dim As Integer UDT.countID = 0

Property UDT.getID () As Integer
  Property = This.ID
End Property

Constructor UDT ()
  This.ID = UDT.countID
  UDT.countID += 1
End Constructor


Dim As UDT uFirst
Dim As UDT uSecond
Dim As UDT uThird

Print uFirst.getID
Print uSecond.getID
Print uThird.getID


Отличия от QB

  • QuickBASIC позволяет переменным и массивам, которые будут объявлены с использованием ключевого слова Static быть только в рамках процедур и DEF FN подпрограмм.
  • Static форсирует локальную видимость для переменных и массивов в QuickBASIC DEF FN подпрограммах. FreeBASIC не поддерживает ни DEF FN подпрограммы, ни такое использование Static.
  • Использование Static для определения переменных-элементов (а также Static процедур-элементов) является новым в FreeBASIC.

См. также