Udostępnij za pośrednictwem


Zakres w Visual Basic

Zakres zadeklarowanego elementu to zestaw wszystkich kodu, który może się do niego odwoływać bez kwalifikowania jego nazwy lub udostępniania go za pośrednictwem instrukcji Import (Przestrzeń nazw i typ platformy .NET). Element może mieć zakres na jednym z następujących poziomów:

poziom Opis
Zakres bloku Dostępny tylko w bloku kodu, w którym jest zadeklarowany
Zakres procedury Dostępny dla wszystkich kodów w procedurze, w której jest zadeklarowany
Zakres modułu Dostępny dla całego kodu w module, klasie lub strukturze, w której jest zadeklarowany
Zakres przestrzeni nazw Dostępny dla wszystkich kodów w przestrzeni nazw, w której jest zadeklarowany

Poziomy zakresu postępują od najwęższego (bloku) do najszerszego (przestrzeni nazw), gdzie najwęższy zakres oznacza najmniejszy zestaw kodu, który może odwoływać się do elementu bez kwalifikacji. Aby uzyskać więcej informacji, zobacz "Poziomy zakresu" na tej stronie.

Określanie zakresu i definiowanie zmiennych

Podczas deklarowania należy określić zakres elementu. Zakres może zależeć od następujących czynników:

  • Region (blok, procedura, moduł, klasa lub struktura), w którym deklarujesz element

  • Przestrzeń nazw zawierająca deklarację elementu

  • Poziom dostępu zadeklarowany dla elementu

Należy zachować ostrożność podczas definiowania zmiennych o tej samej nazwie, ale innym zakresie, ponieważ może to prowadzić do nieoczekiwanych wyników. Aby uzyskać więcej informacji, zobacz Odwołania do zadeklarowanych elementów.

Poziomy zakresu

Element programowania jest dostępny w całym regionie, w którym go deklarujesz. Cały kod w tym samym regionie może odwoływać się do elementu bez kwalifikowania jego nazwy.

Zakres bloku

Blok to zestaw instrukcji zawartych w instrukcjach inicjowania i kończenie deklaracji, takich jak następujące:

  • Do i Loop

  • For [Each] i Next

  • If i End If

  • Select i End Select

  • SyncLock i End SyncLock

  • Try i End Try

  • While i End While

  • With i End With

W przypadku deklarowania zmiennej w bloku można jej używać tylko w ramach tego bloku. W poniższym przykładzie zakres zmiennej całkowitej cube obejmuje blok między If a End If. Po wyjściu wykonania poza ten blok nie można już odwoływać się do cube.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

Uwaga / Notatka

Nawet jeśli zakres zmiennej jest ograniczony do bloku, jego okres istnienia jest nadal taki, jak w całej procedurze. Jeśli wprowadzisz blok więcej niż raz podczas procedury, każda zmienna blokowa zachowa poprzednią wartość. Aby uniknąć nieoczekiwanych wyników w takim przypadku, należy zainicjować zmienne blokowe na początku bloku.

Zakres procedury

Element zadeklarowany w ramach procedury nie jest dostępny poza procedurą. Tylko procedura zawierająca deklarację może jej użyć. Zmienne na tym poziomie są również nazywane zmiennymi lokalnymi. Zadeklarujesz je za pomocą instrukcji Dim z statycznym słowem kluczowym lub bez niego.

Zakres procedur i bloków są ze sobą ściśle powiązane. Jeśli zadeklarujesz zmienną wewnątrz procedury, ale poza dowolnym blokiem w ramach tej procedury, możesz traktować zmienną jako mającą zakres bloków, gdzie blok jest całą procedurą.

Uwaga / Notatka

Wszystkie elementy lokalne, nawet jeśli są Static zmiennymi, są prywatne dla procedury, w której się pojawiają. Nie można zadeklarować żadnego elementu przy użyciu słowa kluczowego Public w ramach procedury.

Zakres modułu

Dla wygody termin poziom modułu stosuje się w równym stopniu do modułów, klas i struktur. Elementy można zadeklarować na tym poziomie, umieszczając instrukcję deklaracji poza dowolną procedurą lub blokiem, ale w module, klasie lub strukturze.

Po utworzeniu deklaracji na poziomie modułu wybrany poziom dostępu określa zakres. Przestrzeń nazw zawierająca moduł, klasę lub strukturę również wpływa na zakres.

Elementy, dla których zadeklarowany jest poziom dostępu prywatnego , są dostępne dla każdej procedury w tym module, ale nie do żadnego kodu w innym module. Instrukcja na poziomie modułu Dim jest ustawiana jako domyślna Private, jeśli nie używasz żadnych słów kluczowych dotyczących poziomu dostępu. Można jednak uczynić zakres i poziom dostępu bardziej oczywistymi, używając słowa kluczowego Private w instrukcji Dim.

W poniższym przykładzie wszystkie procedury zdefiniowane w module mogą odwoływać się do zmiennej ciągu strMsg. Po wywołaniu drugiej procedury wyświetla zawartość zmiennej typu ciąg strMsg w oknie dialogowym.

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

Zakres przestrzeni nazw

Jeśli zadeklarujesz element na poziomie modułu przy użyciu słowa kluczowego Friend lub Public , stanie się on dostępny dla wszystkich procedur w całej przestrzeni nazw, w której element jest zadeklarowany. Po wykonaniu poniższych zmian w poprzednim przykładzie zmienna ciągu strMsg może być odwoływana przez kod w dowolnym miejscu w przestrzeni nazw jego deklaracji.

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

Zakres przestrzeni nazw obejmuje zagnieżdżone przestrzenie nazw. Element dostępny z poziomu przestrzeni nazw jest również dostępny z dowolnego obszaru nazw zagnieżdżonego wewnątrz tej przestrzeni nazw.

Jeśli projekt nie ma żadnych deklaracji przestrzeni nazw, wszystko w projekcie znajduje się w tej samej przestrzeni nazw. W takim przypadku zakres przestrzeni nazw można traktować jako zakres projektu. Public elementy w module, klasie lub strukturze są również dostępne dla każdego projektu, który odwołuje się do projektu.

Wybór zakresu

Podczas deklarowania zmiennej należy pamiętać o następujących kwestiach podczas wybierania jej zakresu.

Zalety zmiennych lokalnych

Zmienne lokalne są dobrym wyborem dla dowolnego rodzaju obliczeń tymczasowych z następujących powodów:

  • Unikanie konfliktów nazw. Lokalne nazwy zmiennych nie są podatne na konflikt. Można na przykład utworzyć kilka różnych procedur zawierających zmienną o nazwie intTemp. Pod warunkiem, że każda intTemp jest zadeklarowana jako zmienna lokalna, każda procedura rozpoznaje tylko własną wersję intTemp. Każda procedura może zmienić wartość w swoim lokalnym zakresie intTemp bez wpływu na zmienne innych procedur intTemp.

  • Zużycie pamięci. Zmienne lokalne zużywają pamięć tylko wtedy, gdy ich procedura jest uruchomiona. Ich pamięć jest zwalniana, gdy procedura powraca do kodu wywołującego. Natomiast zmienne udostępnione i statyczne zużywają zasoby pamięci, dopóki aplikacja nie przestanie działać, więc używaj ich tylko wtedy, gdy jest to konieczne. Zmienne wystąpienia zużywają pamięć, gdy ich instancja nadal istnieje, co sprawia, że są mniej wydajne niż zmienne lokalne, ale potencjalnie bardziej wydajne niż Shared lub Static.

Minimalizacja zakresu

Ogólnie rzecz biorąc, deklarując dowolną zmienną lub stałą, dobrym rozwiązaniem jest uczynienie zakresu tak wąskim, jak to możliwe (zakres bloków jest najwęższy). Pomaga to zaoszczędzić pamięć i zminimalizować prawdopodobieństwo błędnego odwoływania się do nieprawidłowej zmiennej. Podobnie należy zadeklarować zmienną jako statyczną tylko wtedy, gdy jest to konieczne, aby zachować jej wartość między wywołaniami procedury.

Zobacz także