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

Te poziomy postępu zakresu z 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 cube całkowitej to blok między If i End If, a nie można już odwoływać się do cube momentu, gdy wykonanie przejdzie poza blok.

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

Uwaga

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ą. Można użyć tylko procedury zawierającej deklarację. 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ą ś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

Wszystkie elementy lokalne, nawet jeśli są Static zmiennymi, są prywatne do 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 poziom modułu pojedynczego terminu ma zastosowanie 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 domyślna, Private jeśli nie używasz żadnych słów kluczowych na poziomie dostępu. Można jednak zwiększyć stopień zakresu i dostępu, 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 strMsgciągu . Po wywołaniu drugiej procedury wyświetla zawartość zmiennej strMsg ciągu 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 strMsg ciągu może być odwoływanych 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 zawiera żadnych instrukcjiprzestrzeni 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. O ile każda z nich intTemp jest zadeklarowana jako zmienna lokalna, każda procedura rozpoznaje tylko własną wersję programu intTemp. Każda procedura może zmienić wartość w lokalizacji lokalnej intTemp bez wpływu na intTemp zmienne w innych procedurach.

  • 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 wystąpienie nadal istnieje, co sprawia, że są mniej wydajne niż zmienne lokalne, ale potencjalnie bardziej wydajne niż Shared zmienne lub Static zmienne.

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 też