Doba platnosti v jazyce Visual Basic
Životnost deklarovaného prvku je časové období, během kterého je k dispozici pro použití. Proměnné jsou jediné prvky, které mají životnost. Za tímto účelem kompilátor zpracovává parametry procedury a funkce jako speciální případy proměnných. Životnost proměnné představuje časové období, během kterého může obsahovat hodnotu. Jeho hodnota se může během své životnosti změnit, ale vždy obsahuje určitou hodnotu.
Různé životnosti
Členová proměnná (deklarovaná na úrovni modulu, mimo jakoukoli proceduru) má obvykle stejnou životnost jako prvek, ve kterém je deklarován. Nesdílená proměnná deklarovaná ve třídě nebo struktuře existuje jako samostatná kopie pro každou instanci třídy nebo struktury, ve které je deklarována. Každá taková proměnná má stejnou životnost jako její instance. Proměnná Shared
ale má pouze jednu životnost, která trvá celou dobu, kdy je vaše aplikace spuštěná.
Místní proměnná (deklarovaná uvnitř procedury) existuje pouze v době, kdy je procedura, ve které je deklarována, spuštěna. To platí také pro parametry tohoto postupu a pro všechny vrácení funkce. Pokud však tento postup volá jiné procedury, místní proměnné si zachovají své hodnoty, zatímco volané procedury jsou spuštěny.
Začátek životnosti
Životnost místní proměnné začíná, když ovládací prvek zadá proceduru, ve které je deklarována. Každá místní proměnná se inicializuje na výchozí hodnotu svého datového typu, jakmile procedura začne běžet. Když procedura narazí na Dim
příkaz, který určuje počáteční hodnoty, nastaví tyto proměnné na tyto hodnoty, i když váš kód již přiřadil jiné hodnoty.
Každý člen proměnné struktury se inicializuje, jako by šlo o samostatnou proměnnou. Podobně je každý prvek proměnné pole inicializován jednotlivě.
Proměnné deklarované v bloku uvnitř procedury (například For
smyčky) se inicializují při vstupu do procedury. Tato inicializace se projeví bez ohledu na to, jestli váš kód někdy spustí blok.
Konec životnosti
Když se procedura ukončí, hodnoty místních proměnných se nezachovají a Visual Basic uvolní paměť. Při příštím volání procedury se vytvoří všechny místní proměnné afresh a znovu inicializují.
Když instance třídy nebo struktury skončí, její nesdílené proměnné ztratí svou paměť a jejich hodnoty. Každá nová instance třídy nebo struktury vytvoří a znovu inicializuje své nesdílené proměnné. Proměnné se však zachovají, Shared
dokud se aplikace neskončí.
Prodloužení životnosti
Pokud deklarujete místní proměnnou s klíčovým slovem Static
, její životnost je delší než doba provádění jejího postupu. Následující tabulka ukazuje, jak deklarace procedury určuje, jak dlouho proměnná Static
existuje.
Umístění a sdílení procedury | Začíná životnost statických proměnných. | Konec životnosti statické proměnné |
---|---|---|
V modulu (ve výchozím nastavení sdílené) | Při prvním volání procedury | Když aplikace přestane běžet |
Ve třídě Shared (procedura není členem instance) |
Při prvním volání procedury buď v konkrétní instanci, nebo v samotném názvu třídy nebo struktury | Když aplikace přestane běžet |
V instanci třídy ne Shared (procedura je členem instance) |
Při prvním volání procedury pro konkrétní instanci | Při uvolnění instance pro uvolňování paměti (GC) |
Statické proměnné se stejným názvem
Statické proměnné můžete deklarovat se stejným názvem ve více než jednom postupu. Pokud to uděláte, kompilátor jazyka Visual Basic považuje každou takovou proměnnou za samostatný prvek. Inicializace jedné z těchto proměnných nemá vliv na hodnoty ostatních. Totéž platí, pokud definujete proceduru se sadou přetížení a deklarujete statickou proměnnou se stejným názvem v každém přetížení.
Obsahující prvky pro statické proměnné
Můžete deklarovat statickou místní proměnnou v rámci třídy, tj. uvnitř procedury v této třídě. Nemůžete však deklarovat statickou místní proměnnou v rámci struktury, a to buď jako člen struktury, nebo jako místní proměnnou procedury v rámci této struktury.
Příklad
Popis
Následující příklad deklaruje proměnnou s klíčovým slovem Static . (Všimněte si, že nepotřebujete Dim
klíčové slovo, pokud příkaz Dim používá modifikátor, například Static
.)
Kód
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Komentáře
V předchozím příkladu proměnná applesSold
nadále existuje poté, co se procedura runningTotal
vrátí do volajícího kódu. Při příštím runningTotal
zavolání applesSold
se zachová jeho dříve vypočítaná hodnota.
Pokud applesSold
by byly deklarovány bez použití Static
, předchozí kumulované hodnoty by nebyly zachovány napříč voláními runningTotal
. Při příštím runningTotal
zavolání applesSold
se znovu vytvoří a inicializuje na hodnotu 0 a runningTotal
jednoduše se vrátí stejná hodnota, s jakou byla volána.
Kompilace kódu
Hodnotu statické místní proměnné můžete inicializovat jako součást deklarace. Pokud deklarujete pole, které má být Static
, můžete inicializovat jeho pořadí (počet dimenzí), délku jednotlivých dimenzí a hodnoty jednotlivých prvků.
Zabezpečení
V předchozím příkladu můžete vytvořit stejnou životnost deklarací applesSold
na úrovni modulu. Pokud jste tímto způsobem změnili rozsah proměnné, nebude mít k ní už žádný výhradní přístup. Vzhledem k tomu, že ostatní postupy můžou přistupovat k applesSold
hodnotě a měnit její hodnotu, může být průběžný součet nespolehlivý a kód by mohl být obtížnější udržovat.