W Visual Basic zmienne wewnątrz procedur zazwyczaj tracą wartość po zakończeniu wywołania. Słowo kluczowe Static pozwala zmiennej zachować swoją wartość między wywołaniami procedury.
Historia zagadnienia:
W klasycznym Visual Basic (VB6) i VB.NET Static był często używany do tworzenia liczników i flag bez użycia pól klasy lub modułu.
Problem:
Programista może używać zwykłych zmiennych lokalnych, licząc na ich "trwałość", podczas gdy są one zerowane przy każdym wywołaniu. Z drugiej strony, wybrane miejsce (ciało procedury lub blok kodu) dla zmiennej statycznej może być błędne.
Rozwiązanie:
Zadeklaruj zmienną używając Static wewnątrz procedury. Jest ona inicjowana raz przy pierwszym wywołaniu procedury, a następnie zachowuje swoją wartość między wywołaniami.
Przykład kodu:
Sub CountCalls() Static counter As Integer = 0 counter += 1 Console.WriteLine($"Wywołanie numer: {counter}") End Sub ' Wywołania spowodują różne wartości CountCalls() ' 1 CountCalls() ' 2 CountCalls() ' 3
Kluczowe cechy:
Static istnieje tylko w zakresie procedury, ale zachowuje wartość między wywołaniamiCzym różni się Static w procedurze od pola klasy z modyfikatorem Shared?
Zmienna Static działa tylko w danej procedurze — każdy egzemplarz metody ma swoją niezależną zmienną statyczną. Pole Shared klasy jest jedno dla całej klasy.
Czy można zadeklarować zmienną Static w bloku For lub If?
Nie, zmienne Static są zadeklarowane tylko na najwyższym poziomie procedury, nie można ich zadeklarować wewnątrz zagnieżdżonych bloków (For, If).
Co się stanie, gdy procedura z Static zostanie wywołana z kilku wątków?
W wersji VB.NET obszar zmiennych Static jest związany z każdym wątkiem, co może powodować race condition i nieoczekiwane wartości przy wywołaniach wielowątkowych.
W procedurze obliczania reakcji użytkownika na naciśnięcie klawisza używa się Static do przechowywania czasu wyzwolenia, ale nie uwzględniają jednoczesnego naciśnięcia przez wielu użytkowników (np. aplikacja webowa lub wielowątkowe okno).
Zalety:
Wady:
Static używane do przechowywania wewnętrznego licznika wywołań metody pomocniczej, wywoływanej tylko synchronicznie z jednego wątku.
Zalety:
Wady: