Okres istnienia w Visual Basic
Okres istnienia zadeklarowanego elementu to okres, w którym jest dostępny do użycia. Zmienne to jedyne elementy, które mają okres istnienia. W tym celu kompilator traktuje parametry procedury i funkcję zwracaną jako specjalne przypadki zmiennych. Okres istnienia zmiennej reprezentuje okres, w którym może przechowywać wartość. Jego wartość może ulec zmianie w okresie istnienia, ale zawsze zawiera pewną wartość.
Różne okresy istnienia
Zmienna składowa (zadeklarowana na poziomie modułu, poza dowolną procedurą) zwykle ma ten sam okres istnienia co element, w którym jest zadeklarowany. Zmienna nieudostępna zadeklarowana w klasie lub strukturze istnieje jako oddzielna kopia dla każdego wystąpienia klasy lub struktury, w której jest zadeklarowana. Każda taka zmienna ma taki sam okres istnienia jak jego wystąpienie. Jednak zmienna Shared
ma tylko jeden okres istnienia, który trwa przez cały czas działania aplikacji.
Zmienna lokalna (zadeklarowana wewnątrz procedury) istnieje tylko wtedy, gdy procedura, w której jest zadeklarowana, jest uruchomiona. Dotyczy to również parametrów tej procedury i wszystkich zwracanych funkcji. Jeśli jednak ta procedura wywołuje inne procedury, zmienne lokalne zachowują swoje wartości, gdy są uruchomione wywoływane procedury.
Początek okresu istnienia
Okres istnienia zmiennej lokalnej rozpoczyna się, gdy kontrolka wprowadza procedurę, w której jest zadeklarowana. Każda zmienna lokalna jest inicjowana do wartości domyślnej dla jej typu danych, gdy tylko procedura zacznie działać. Gdy procedura napotka instrukcję określającą Dim
wartości początkowe, ustawia te zmienne na te wartości, nawet jeśli kod już przypisał do nich inne wartości.
Każdy element członkowski zmiennej struktury jest inicjowany tak, jakby był oddzielną zmienną. Podobnie każdy element zmiennej tablicowej jest inicjowany indywidualnie.
Zmienne zadeklarowane w bloku wewnątrz procedury (takiej jak pętla For
) są inicjowane we wpisie do procedury. Te inicjacje mają wpływ na to, czy kod kiedykolwiek wykonuje blok.
Koniec okresu istnienia
Po zakończeniu procedury wartości zmiennych lokalnych nie są zachowywane, a program Visual Basic odzyskuje pamięć. Przy następnym wywołaniu procedury wszystkie jej zmienne lokalne są tworzone na nowo i ponownie zainicjowane.
Gdy wystąpienie klasy lub struktury zakończy się, jego zmienne nieudostępne tracą pamięć i ich wartości. Każde nowe wystąpienie klasy lub struktury tworzy i ponownie inicjuje zmienne nieudostępne. Shared
Jednak zmienne są zachowywane do momentu, aż aplikacja przestanie działać.
Przedłużenie okresu istnienia
Jeśli zadeklarujesz zmienną lokalną za pomocą słowa kluczowego Static
, jego okres istnienia jest dłuższy niż czas wykonywania jego procedury. W poniższej tabeli pokazano, jak deklaracja procedury określa, jak długo istnieje zmienna Static
.
Lokalizacja procedury i udostępnianie | Rozpoczyna się okres istnienia zmiennej statycznej | Zakończenie okresu istnienia zmiennej statycznej |
---|---|---|
W module (udostępnionym domyślnie) | Przy pierwszym wywołaniu procedury | Gdy aplikacja przestanie działać |
W klasie Shared (procedura nie jest elementem członkowskim wystąpienia) |
Przy pierwszym wywołaniu procedury w konkretnym wystąpieniu lub samej nazwie klasy lub struktury | Gdy aplikacja przestanie działać |
W wystąpieniu klasy, a nie Shared (procedura jest elementem członkowskim wystąpienia) |
Przy pierwszym wywołaniu procedury w konkretnym wystąpieniu | Po wydaniu wystąpienia do odzyskiwania pamięci (GC) |
Zmienne statyczne o tej samej nazwie
Zmienne statyczne można zadeklarować pod tą samą nazwą w więcej niż jednej procedurze. Jeśli to zrobisz, kompilator języka Visual Basic uzna każdą taką zmienną za oddzielny element. Inicjowanie jednej z tych zmiennych nie ma wpływu na wartości innych. To samo dotyczy definiowania procedury z zestawem przeciążeń i deklarowania zmiennej statycznej o tej samej nazwie w każdym przeciążeniu.
Zawieranie elementów dla zmiennych statycznych
Możesz zadeklarować statyczną zmienną lokalną w klasie, czyli wewnątrz procedury w tej klasie. Nie można jednak zadeklarować statycznej zmiennej lokalnej w strukturze jako składowej struktury lub jako lokalnej zmiennej procedury w ramach tej struktury.
Przykład
opis
W poniższym przykładzie zadeklarowana jest zmienna ze słowem kluczowym Static . (Pamiętaj, że nie potrzebujesz słowa kluczowego Dim
, gdy instrukcja Dim używa modyfikatora, takiego jak Static
.)
Kod
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Komentarze
W poprzednim przykładzie zmienna applesSold
nadal istnieje po powrocie procedury runningTotal
do kodu wywołującego. Przy następnym wywołaniu runningTotal
applesSold
funkcja zachowuje wcześniej obliczoną wartość.
Jeśli applesSold
zostały zadeklarowane bez użycia Static
metody , poprzednie skumulowane wartości nie zostaną zachowane między wywołaniami metody runningTotal
. Przy następnym wywołaniu runningTotal
applesSold
funkcja zostałaby ponownie utworzona i zainicjowana do wartości 0 i runningTotal
zostałaby po prostu zwrócona ta sama wartość, z którą została wywołana.
Kompilowanie kodu
Można zainicjować wartość statycznej zmiennej lokalnej w ramach jej deklaracji. W przypadku deklarowania tablicy jako Static
, można zainicjować jej rangę (liczbę wymiarów), długość każdego wymiaru i wartości poszczególnych elementów.
Zabezpieczenia
W poprzednim przykładzie można utworzyć ten sam okres istnienia, deklarując applesSold
na poziomie modułu. Jeśli jednak zmienisz zakres zmiennej w ten sposób, procedura nie będzie już miała wyłącznego dostępu do tej zmiennej. Ponieważ inne procedury mogą uzyskać dostęp do applesSold
jego wartości i zmienić jej wartość, suma bieżąca może być zawodna, a kod może być trudniejszy do utrzymania.