Променливата
може да се дефинира като отделна единица, която има следните шест свойства:
Name
Името
на променливата се използва да се идентифицира променливата в кода. Във VB
.NET, името на променливата може да стартира с Unicode алфабетен символ или
като долна черта, и може да следва с други долни черти или символи с Unicode
алфабетен характер, като букви, цифри, форматиращи или комбинирани символи.
Address
Всяка
променлива има асоцииран адрес (address) в паметта, който представлява локацията в
паметта, където е съхранена променливата. Забележете, че при много
обстоятелства, адресът на променливата се променя през времето на нейния живот.
Type
Типът
на променливата, наричан още тип данни (data
type), определя възможните стойности, които тя може да приеме.
Value
Стойността
на променливата е съдържанието й в локацията на паметта (на адреса в паметта).
Понякога
се казва, че това е r-value (r-стойност) на променливата, реалната стойност от дясната страна на
оператора за присвояване. Например кода:
Dim i As Integer
Dim j As Integer
i = 5
j = i
последния
оператор може да бъде прочетен така "присвояваме стойност (value) i на клетка от паметта с адреса на j." От подобни съображения, адресът
на променливата се нарича често нейна l- value (l-стойност).
Scope
Обсегът
на дейстие на променливата се определя от това къде е видима в кода.
Lifetime
Времето
на живот на променливата
се определя от това кога и колко дълго отделната променлива съществува. Тя може да е видима или не, за
даден период.
- Обсег на действие на променливите - (Variable
Scope)
Променливите
(и константите) имат обсег на действие (scope). Той дава индикация къде
в програмата се разпознава променливата или така да се каже е видима (visible) от кода, тоест, къде тя може да се свърже
с кода.
· Локални променливи (Local): на ниво блок
(block-level) и на ниво процедура (procedure-level)
Ако
променливата е декларирана вътре в блок код (code block - множество команди, завършващи с End..., Loop, или Next), тогава тя
има диапазон на действие на ниво блок (block-level scope); това означава, че е видима само
вътре в този блок.
Например
следния код:
If x <> 0 Then
Dim rec As Integer
rec = 1/x
End If
MsgBox CStr(rec)
В този
код, променливата rec не се разпознава извън блока, в който е дефинирана, така че финалната команда
произвежда грешка. Интересно е да се отбележи, че времето на живот (lifetime) на променливата винаги е свързано
с цялата процедура,
даже и диапазона на действие да е блоков (block-level). Това означава, че ако блокът
влезе в действие повече от веднаж, блоковата променлива ще продължи със
стойността от предишния път, когато се е изпълнявал кода.
Променлива, декларирана с ключова дума Dim вътре в процедура на Visual Basic, но не вътре в блок, има област на действие на ниво
процедура (procedure-level scope). Действието й е в процедурата, където е
декларирана.
Променливи,
които действатна ниво блок (block-level) и на ниво процедура (procedure-level)- се
наричат ЛОКАЛНИ.
Предимството
им е, че могат да се използват същите имена и другаде без конфликт, защото са
видими само в своята процедура. Друго предимство е освобождаването на паметта,
веднага, след като контрола напусне процедурата, което прави кода по-лесен за
поддържане.
· Обсег на действие на ниво модул (Module-level) и на ниво проект (project-level)
Съществува разлика между начина по който се определя
областта на действие
на променливи декларирани в секцията за декларации (Declarations
section) в стандартния модул и в клас -
модула. Ще се ограничим тук до стандартния модул. Първо да отбележим,
че самият
стандартен модул трябва да бъде деклариран чрез модификатора Public,
Friend, или Private
по подразбиране (default). Тези декларации стриктно
ограничават областта на действие. Така например, Public променлива,
декларирана в модул, който е Friend има област на действие Friend.
1 Private достъп
Променлива,
декларирана в декларационна секция (Declarations) на стандартен (standard) модул чрез модификатора за Private
достъп има област на
действие на ниво модул (module-level scope); видима е в целия модул, но
никъде другаде. Използването на ключова дума Dim също дава на променливата област на действие на ниво модул, но нейното
използване не е ясно и би следвало да бъде избягвано в интерес на четливостта.
2 Friend достъп
Променлива,
декларирана в декларационна секция (Declarations) на стандартен (standard) модул чрез модификатора за Friend достъп е видима за целия проект и има област на действие на ниво
проект (project-level scope). Не е видима в други проекти.
3 Public достъп
Променлива,
декларирана в декларационна секция (Declarations) на Public стандартен (standard) модул
чрез модификатора за Public достъп е видима за целия проект и също така във всички външни
проекти, които имат връзка с проекта. Например декларираните модули в Project1:
Public Module Module1
Public iModulePublic As Integer
Friend iModuleFriend As Integer
End Module
Ако
Project2 има връзка с Project1, тогава може да запишем:
Project1.Module1.iModulePublic = 100
Докато
кодът:
Project1.Module1.iModuleFriend = 100
генерира
синтактическа грешка "not accessible".
- Време на живот на променливите - (Variable
Lifetime)
Променливите
имат също време на живот (lifetime). Разликата между време на живот и обсег на
действие е проста: времето
на живот се определя от това кога, по време на изпълнение на
програмата е валидна променливата; обсега на действие се определя от
това къде в програмата, променливата се
разпознава от кода (visible). За да илюстрираме разликите, да разгледаме следната процедура:
Sub ProcedureA( )
Dim LocalVar As Integer = 0
Call ProcedureB
LocalVar = 1
End Sub
Забележете
LocalVar е локална променлива. Когато се изпълнява редът:
Call ProcedureB
изпълнението
превключва към ProcedureB. Докато редът ProcedureB се изпълнява,
променливата LocalVar e извън обхват, защото е локална за процедура ProcedureA.
Но е още валидна, с други думи тя още съществува и има стойност. Тя просто не е достъпна за кода в
процедура ProcedureB. Фактически, ProcedureB би могла да има променлива с име LocalVar, която няма да има нищо общо с
тази в процедура ProcedureA.
След
като свърши ProcedureB, изпълнението продължава в процедура ProcedureA с реда:
LocalVar = 1
който
е валидна инструкция, защото променлива LocalVar отново е в обсег. Така че, времето на живот на променливата LocalVar се простира от момента когато е пусната процедура ProcedureA , до момента, когато свършва, включвайки периода, когато е
действала процедура ProcedureB , защото тази процедура се вика от
процедура А, макар че по това време променливата LocalVar е извън обсег.
Нека
да споменем отново, че времето на живот на блокова променлива е времето на
действие на процедурата, в която тази променлива е дефинирана.
Статични (Static) променливи
Видяхме,
че променливата може да влиза и излиза от обсег по време на своя живот. Но когато свърши времето на живот
на променливата, тя се разрушава и стойността й се губи. Времето на живот определя съществуването на
променливата; обсегът
й определя само видимостта.
Разгледайте
следната процедура:
Sub ProcedureA( )
Call ProcedureB
Call ProcedureB
Call ProcedureB
Call ProcedureB
Call ProcedureB
End Sub
Sub ProcedureB( )
Dim x As Integer
x = 5
. . .
End Sub
Когато
процедура ProcedureA се изпълнява, тя вика пет пъти процедура ProcedureB.
Всеки път, когато се вика процедура ProcedureB, локалната променлива x се създава наново и се разрушава, когато свърши изпълнението на
процедура B. Или, x се създава и разрушава пет пъти.
Нормално, това е точно каквото искаме. Ако искаме променливата да живее
по-дълго, можем да я декларираме като статична.
Статичната
променлива е локална променлива, чието време на
живот е времето на цялата програма. Следният код на VB показва как може да се използва
статична променлива:
Sub test( )
Static bFirstTime As Boolean = True
If bFirstTime Then
Debug.WriteLine("first time")
bFirstTime = False
Else
Debug.WriteLine("not first time")
End If
End Sub
Забележете,
че можем да инициализираме статична променлива, вътре в
декларацията на променливата. Ето илюстрацията:
Sub StaticTest( )
Static st As Boolean = True ' инициализиране на статична
променлива
MsgBox(st)
st = False
End Sub
Private Sub button1_Click(ByVal sender As System.Object,
_
ByVal e As System.EventArgs) Handles button1.Click
StaticTest( )
End Sub
Първият
път, когато натиснем команден бутон - button1, StaticTest извежда
съобщение True, защото статичната променлива st е инициализирана в True. След това, всеки път когато
натиснем бутона, StaticTest връща False.