Zakres w Visual BasicScope in Visual Basic

Zakres zadeklarowanego elementu jest zestawem wszystkich kodów, które mogą odwoływać się do niego bez zakwalifikowania jego nazwy lub udostępniania za pomocą instrukcji Imports (przestrzeń nazw i typ .NET).The scope of a declared element is the set of all code that can refer to it without qualifying its name or making it available through an Imports Statement (.NET Namespace and Type). Element może mieć zakres na jednym z następujących poziomów:An element can have scope at one of the following levels:

PoziomLevel OpisDescription
Zakres blokuBlock scope Dostępne tylko w bloku kodu, w którym jest zadeklarowanyAvailable only within the code block in which it is declared
Zakres proceduryProcedure scope Dostępne dla całego kodu w ramach procedury, w której jest zadeklarowanyAvailable to all code within the procedure in which it is declared
Zakres modułuModule scope Dostępne dla wszystkich kodów w module, klasie lub strukturze, w których jest zadeklarowanaAvailable to all code within the module, class, or structure in which it is declared
Zakres przestrzeni nazwNamespace scope Dostępne dla całego kodu w przestrzeni nazw, w którym jest zadeklarowanyAvailable to all code in the namespace in which it is declared

Poziomy postęp zakresu 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.These levels of scope progress from the narrowest (block) to the widest (namespace), where narrowest scope means the smallest set of code that can refer to the element without qualification. Aby uzyskać więcej informacji, zobacz sekcję "poziomy zakresu" na tej stronie.For more information, see "Levels of Scope" on this page.

Określanie zakresu i Definiowanie zmiennychSpecifying Scope and Defining Variables

Należy określić zakres elementu podczas jego deklarowania.You specify the scope of an element when you declare it. Zakres może zależeć od następujących czynników:The scope can depend on the following factors:

  • Region (blok, procedura, moduł, Klasa lub struktura), w którym deklarujesz elementThe region (block, procedure, module, class, or structure) in which you declare the element

  • Przestrzeń nazw zawierająca deklarację elementuThe namespace containing the element's declaration

  • Poziom dostępu zadeklarowany dla elementuThe access level you declare for the element

Należy zachować ostrożność podczas definiowania zmiennych o tej samej nazwie, ale innym zakresie, ponieważ takie działanie może prowadzić do nieoczekiwanych wyników.Use care when you define variables with the same name but different scope, because doing so can lead to unexpected results. Aby uzyskać więcej informacji, zobacz odwołania do zadeklarowanych elementów.For more information, see References to Declared Elements.

Poziomy zakresuLevels of Scope

Element programistyczny jest dostępny w całym regionie, w którym jest zadeklarowana.A programming element is available throughout the region in which you declare it. Cały kod w tym samym regionie może odwoływać się do elementu bez kwalifikowania jego nazwy.All code in the same region can refer to the element without qualifying its name.

Zakres blokuBlock Scope

Blok to zestaw instrukcji ujętych w instrukcji inicjujących i kończących deklaracje, takich jak następujące:A block is a set of statements enclosed within initiating and terminating declaration statements, such as the following:

  • Do i LoopDo and Loop

  • For[ Each ] iNextFor [Each] and Next

  • If i End IfIf and End If

  • Select i End SelectSelect and End Select

  • SyncLock i End SyncLockSyncLock and End SyncLock

  • Try i End TryTry and End Try

  • While i End WhileWhile and End While

  • With i End WithWith and End With

Jeśli zadeklarujesz zmienną w bloku, można jej używać tylko w obrębie tego bloku.If you declare a variable within a block, you can use it only within that block. W poniższym przykładzie zakres zmiennej całkowitej cube jest blokiem między If i i End If nie można już się odwoływać, cube gdy wykonywanie kończy się z bloku.In the following example, the scope of the integer variable cube is the block between If and End If, and you can no longer refer to cube when execution passes out of the block.

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 w całej procedurze.Even if the scope of a variable is limited to a block, its lifetime is still that of the entire procedure. W przypadku wprowadzenia bloku więcej niż raz podczas procedury Każda zmienna bloku zachowuje poprzednią wartość.If you enter the block more than once during the procedure, each block variable retains its previous value. Aby uniknąć nieoczekiwanych wyników w taki sposób, należy inicjować zmienne blokowe na początku bloku.To avoid unexpected results in such a case, it is wise to initialize block variables at the beginning of the block.

Zakres proceduryProcedure Scope

Element zadeklarowany w ramach procedury nie jest dostępny poza tą procedurą.An element declared within a procedure is not available outside that procedure. Tylko procedura, która zawiera deklarację, może jej używać.Only the procedure that contains the declaration can use it. Zmienne na tym poziomie są również nazywane zmiennymi lokalnymi.Variables at this level are also known as local variables. Deklaruje je za pomocą instrukcji Dimz lub bez słowa kluczowego static .You declare them with the Dim Statement, with or without the Static keyword.

Procedura i zakres bloku są ściśle powiązane.Procedure and block scope are closely related. Jeśli zadeklarujesz zmienną wewnątrz procedury, ale poza jakimkolwiek blokiem w ramach tej procedury, można myśleć o zmiennej jako zakresu bloku, gdzie blok jest całą procedurą.If you declare a variable inside a procedure but outside any block within that procedure, you can think of the variable as having block scope, where the block is the entire procedure.

Uwaga

Wszystkie elementy lokalne, nawet jeśli są Static zmiennymi, są prywatne do procedury, w której się znajdują.All local elements, even if they are Static variables, are private to the procedure in which they appear. Nie można zadeklarować żadnego elementu za pomocą publicznego słowa kluczowego w ramach procedury.You cannot declare any element using the Public keyword within a procedure.

Zakres modułuModule Scope

Dla wygody poziom jednoterminowego modułu jest stosowany równomiernie dla modułów, klas i struktur.For convenience, the single term module level applies equally to modules, classes, and structures. Można zadeklarować elementy na tym poziomie poprzez umieszczenie instrukcji deklaracji poza procedurą lub blokiem, ale w module, klasie lub strukturze.You can declare elements at this level by placing the declaration statement outside of any procedure or block but within the module, class, or structure.

Po wprowadzeniu deklaracji na poziomie modułu wybrany poziom dostępu określa zakres.When you make a declaration at the module level, the access level you choose determines the scope. Przestrzeń nazw, która zawiera moduł, klasę lub strukturę, ma także wpływ na zakres.The namespace that contains the module, class, or structure also affects the scope.

Elementy, dla których deklarujesz prywatny poziom dostępu, są dostępne dla każdej procedury w tym module, ale nie do żadnego kodu w innym module.Elements for which you declare Private access level are available to every procedure in that module, but not to any code in a different module. W Dim Private przypadku, gdy nie są używane żadne słowa kluczowe poziomu dostępu.The Dim statement at module level defaults to Private if you do not use any access level keywords. Jednak zakres i poziom dostępu można uczynić bardziej oczywistymi przy użyciu Private słowa kluczowego w Dim instrukcji.However, you can make the scope and access level more obvious by using the Private keyword in the Dim statement.

W poniższym przykładzie wszystkie procedury zdefiniowane w module mogą odwoływać się do zmiennej ciągu strMsg .In the following example, all procedures defined in the module can refer to the string variable strMsg. Gdy druga procedura jest wywoływana, wyświetla zawartość zmiennej String strMsg w oknie dialogowym.When the second procedure is called, it displays the contents of the string variable strMsg in a dialog box.

' 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 nazwNamespace Scope

Jeśli zadeklarujesz element na poziomie modułu przy użyciu słowa kluczowego zaprzyjaźnione lub publiczne , będzie on dostępny dla wszystkich procedur w całym obszarze nazw, w którym jest zadeklarowany element.If you declare an element at module level using the Friend or Public keyword, it becomes available to all procedures throughout the namespace in which the element is declared. Przy następujących zmianach do powyższego przykładu zmienna String strMsg może być określana przez kod w dowolnym miejscu w przestrzeni nazw swojej deklaracji.With the following alteration to the preceding example, the string variable strMsg can be referred to by code anywhere in the namespace of its declaration.

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

Zakres przestrzeni nazw zawiera zagnieżdżone przestrzenie nazw.Namespace scope includes nested namespaces. Element dostępny w przestrzeni nazw jest również dostępny z poziomu dowolnej przestrzeni nazw zagnieżdżonej w tej przestrzeni nazw.An element available from within a namespace is also available from within any namespace nested inside that namespace.

Jeśli projekt nie zawiera żadnych instrukcji Namespace, wszystko w projekcie znajduje się w tej samej przestrzeni nazw.If your project does not contain any Namespace Statements, everything in the project is in the same namespace. W takim przypadku zakres przestrzeni nazw może być uważany za zakres projektu.In this case, namespace scope can be thought of as project scope. Publicelementy w module, klasie lub strukturze są również dostępne dla każdego projektu, który odwołuje się do projektu.Public elements in a module, class, or structure are also available to any project that references their project.

Wybór zakresuChoice of Scope

Podczas deklarowania zmiennej należy pamiętać o następujących kwestiach podczas wybierania jej zakresu.When you declare a variable, you should keep in mind the following points when choosing its scope.

Zalety zmiennych lokalnychAdvantages of Local Variables

Zmienne lokalne są dobrym wyborem dla dowolnego rodzaju obliczeń tymczasowych, z następujących powodów:Local variables are a good choice for any kind of temporary calculation, for the following reasons:

  • Unikanie konfliktu nazw.Name Conflict Avoidance. Nazwy zmiennych lokalnych nie są podatne na konflikt.Local variable names are not susceptible to conflict. Na przykład można utworzyć kilka różnych procedur zawierających zmienną o nazwie intTemp .For example, you can create several different procedures containing a variable called intTemp. O ile każda intTemp z nich jest zadeklarowana jako zmienna lokalna, każda procedura rozpoznaje tylko własną wersję programu intTemp .As long as each intTemp is declared as a local variable, each procedure recognizes only its own version of intTemp. Każda procedura może zmienić wartość w jej lokalnej intTemp bez wpływu na intTemp zmienne w innych procedurach.Any one procedure can alter the value in its local intTemp without affecting intTemp variables in other procedures.

  • Użycie pamięci.Memory Consumption. Zmienne lokalne zużywają pamięć tylko wtedy, gdy ich procedura jest uruchomiona.Local variables consume memory only while their procedure is running. Pamięć jest wydawana, gdy procedura wraca do kodu wywołującego.Their memory is released when the procedure returns to the calling code. Z kolei zmienne udostępnione i statyczne zużywają zasoby pamięci do momentu zatrzymania działania aplikacji, dlatego należy używać ich tylko w razie potrzeby.By contrast, Shared and Static variables consume memory resources until your application stops running, so use them only when necessary. Zmienne wystąpień zużywają pamięć, gdy ich wystąpienie nadal istnieje, co sprawia, że są mniej wydajne niż zmienne lokalne, ale potencjalnie bardziej wydajne niż Shared lub Static zmienne.Instance variables consume memory while their instance continues to exist, which makes them less efficient than local variables, but potentially more efficient than Shared or Static variables.

Minimalizacja zakresuMinimizing Scope

Ogólnie rzecz biorąc, w przypadku deklarowania dowolnej zmiennej lub stałej jest dobrym sposobem programowania, aby zakres był możliwie wąski (zakres blokowy jest najwęższy).In general, when declaring any variable or constant, it is good programming practice to make the scope as narrow as possible (block scope is the narrowest). Pozwala to zaoszczędzić pamięć i zminimalizować prawdopodobieństwo błędnego kodu do niewłaściwej zmiennej.This helps conserve memory and minimizes the chances of your code erroneously referring to the wrong variable. Podobnie należy zadeklarować zmienną, która ma być statyczna tylko wtedy, gdy jest to konieczne, aby zachować jej wartość między wywołaniami procedur.Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

Zobacz teżSee also