Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
iLoop
For
[Each
] iNext
If
iEnd If
Select
iEnd Select
SyncLock
iEnd SyncLock
Try
iEnd Try
While
iEnd While
With
iEnd 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żdaintTemp
jest zadeklarowana jako zmienna lokalna, każda procedura rozpoznaje tylko własną wersjęintTemp
. Każda procedura może zmienić wartość w swoim lokalnym zakresieintTemp
bez wpływu na zmienne innych procedurintTemp
.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
lubStatic
.
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.