Ambito in Visual BasicScope in Visual Basic

L' ambito di un elemento dichiarato è il set di tutto il codice che può farvi riferimento senza qualificarne il nome o renderlo disponibile tramite un' istruzione Imports (tipo e spazio dei nomi .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). Un elemento può avere un ambito a uno dei livelli seguenti:An element can have scope at one of the following levels:

LevelLevel DescrizioneDescription
Ambito del bloccoBlock scope Disponibile solo all'interno del blocco di codice in cui è dichiarataAvailable only within the code block in which it is declared
Ambito proceduraProcedure scope Disponibile per tutto il codice all'interno della routine in cui è dichiarataAvailable to all code within the procedure in which it is declared
Ambito del moduloModule scope Disponibile per tutto il codice all'interno del modulo, della classe o della struttura in cui è dichiarataAvailable to all code within the module, class, or structure in which it is declared
Ambito dello spazio dei nomiNamespace scope Disponibile per tutto il codice nello spazio dei nomi in cui è dichiaratoAvailable to all code in the namespace in which it is declared

Questi livelli di avanzamento dell'ambito dal più piccolo (blocco) al più ampio (spazio dei nomi), dove l' ambito più ristretto indica il set di codice più piccolo che può fare riferimento all'elemento senza qualifica.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. Per ulteriori informazioni, vedere "livelli di ambito" in questa pagina.For more information, see "Levels of Scope" on this page.

Specifica dell'ambito e definizione delle variabiliSpecifying Scope and Defining Variables

L'ambito di un elemento viene specificato quando lo si dichiara.You specify the scope of an element when you declare it. L'ambito può dipendere dai fattori seguenti:The scope can depend on the following factors:

  • Area (Block, procedure, modulo, classe o struttura) in cui viene dichiarato l'elementoThe region (block, procedure, module, class, or structure) in which you declare the element

  • Spazio dei nomi contenente la dichiarazione dell'elemento.The namespace containing the element's declaration

  • Livello di accesso dichiarato per l'elementoThe access level you declare for the element

Prestare attenzione quando si definiscono le variabili con lo stesso nome ma con un ambito diverso, perché questa operazione può causare risultati imprevisti.Use care when you define variables with the same name but different scope, because doing so can lead to unexpected results. Per altre informazioni, vedere References to Declared Elements.For more information, see References to Declared Elements.

Livelli di ambitoLevels of Scope

Un elemento di programmazione è disponibile nell'area geografica in cui viene dichiarata.A programming element is available throughout the region in which you declare it. Tutto il codice nella stessa area può fare riferimento all'elemento senza qualificare il nome.All code in the same region can refer to the element without qualifying its name.

Ambito del bloccoBlock Scope

Un blocco è un set di istruzioni racchiuse tra istruzioni di inizializzazione e terminazione di dichiarazione, come le seguenti:A block is a set of statements enclosed within initiating and terminating declaration statements, such as the following:

  • Do e LoopDo and Loop

  • For [ Each ] e NextFor [Each] and Next

  • If e End IfIf and End If

  • Select e End SelectSelect and End Select

  • SyncLock e End SyncLockSyncLock and End SyncLock

  • Try e End TryTry and End Try

  • While e End WhileWhile and End While

  • With e End WithWith and End With

Se si dichiara una variabile all'interno di un blocco, è possibile utilizzarla solo all'interno di tale blocco.If you declare a variable within a block, you can use it only within that block. Nell'esempio seguente, l'ambito della variabile integer cube è il blocco tra e e If End If non è più possibile fare riferimento a quando l' cube esecuzione passa all'esterno del blocco.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

Nota

Anche se l'ambito di una variabile è limitato a un blocco, la sua durata è ancora quella dell'intera procedura.Even if the scope of a variable is limited to a block, its lifetime is still that of the entire procedure. Se durante la procedura si immette più di una volta il blocco, ogni variabile di blocco mantiene il valore precedente.If you enter the block more than once during the procedure, each block variable retains its previous value. Per evitare risultati imprevisti in tal caso, è consigliabile inizializzare le variabili di blocco all'inizio del blocco.To avoid unexpected results in such a case, it is wise to initialize block variables at the beginning of the block.

Ambito proceduraProcedure Scope

Un elemento dichiarato all'interno di una routine non è disponibile all'esterno di tale procedura.An element declared within a procedure is not available outside that procedure. Solo la routine che contiene la dichiarazione può usarla.Only the procedure that contains the declaration can use it. Le variabili a questo livello sono note anche come variabili locali.Variables at this level are also known as local variables. Vengono dichiarati con l' istruzione Dim, con o senza la parola chiave static .You declare them with the Dim Statement, with or without the Static keyword.

La procedura e l'ambito del blocco sono strettamente correlati.Procedure and block scope are closely related. Se si dichiara una variabile all'interno di una routine, ma all'esterno di qualsiasi blocco all'interno di tale procedura, è possibile considerare la variabile come avente un ambito di blocco, in cui il blocco è l'intera routine.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.

Nota

Tutti gli elementi locali, anche se sono Static variabili, sono privati della routine in cui vengono visualizzati.All local elements, even if they are Static variables, are private to the procedure in which they appear. Non è possibile dichiarare alcun elemento utilizzando la parola chiave public all'interno di una routine.You cannot declare any element using the Public keyword within a procedure.

Ambito del moduloModule Scope

Per praticità, il livello del modulo a singolo termine si applica ugualmente a moduli, classi e strutture.For convenience, the single term module level applies equally to modules, classes, and structures. È possibile dichiarare elementi a questo livello inserendo l'istruzione di dichiarazione all'esterno di qualsiasi routine o blocco, ma all'interno del modulo, della classe o della struttura.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.

Quando si crea una dichiarazione a livello di modulo, il livello di accesso scelto determina l'ambito.When you make a declaration at the module level, the access level you choose determines the scope. Lo spazio dei nomi che contiene il modulo, la classe o la struttura influiscono anche sull'ambito.The namespace that contains the module, class, or structure also affects the scope.

Gli elementi per i quali si dichiara il livello di accesso privato sono disponibili per tutte le procedure del modulo, ma non per il codice in un modulo diverso.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. L' Dim istruzione a livello di modulo viene utilizzata per impostazione predefinita Private se non si utilizzano parole chiave del livello di accesso.The Dim statement at module level defaults to Private if you do not use any access level keywords. Tuttavia, è possibile rendere più evidenti l'ambito e il livello di accesso utilizzando la Private parola chiave nell' Dim istruzione.However, you can make the scope and access level more obvious by using the Private keyword in the Dim statement.

Nell'esempio seguente, tutte le routine definite nel modulo possono fare riferimento alla variabile di stringa strMsg .In the following example, all procedures defined in the module can refer to the string variable strMsg. Quando viene chiamata la seconda procedura, viene visualizzato il contenuto della variabile stringa strMsg in una finestra di dialogo.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

Ambito dello spazio dei nomiNamespace Scope

Se si dichiara un elemento a livello di modulo usando la parola chiave Friend o public , diventa disponibile per tutte le routine in tutto lo spazio dei nomi in cui viene dichiarato l'elemento.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. Con la seguente modifica all'esempio precedente, strMsg è possibile fare riferimento alla variabile di stringa dal codice in qualsiasi punto dello spazio dei nomi della relativa dichiarazione.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

Lo spazio dei nomi include spazi dei nomi annidati.Namespace scope includes nested namespaces. Un elemento disponibile in uno spazio dei nomi è disponibile anche all'interno di qualsiasi spazio dei nomi annidato all'interno di tale spazio dei nomi.An element available from within a namespace is also available from within any namespace nested inside that namespace.

Se il progetto non contiene alcuna istruzione dello spazio dei nomi, tutti gli elementi del progetto si trova nello stesso spazio dei nomi.If your project does not contain any Namespace Statements, everything in the project is in the same namespace. In questo caso, l'ambito dello spazio dei nomi può essere considerato come ambito del progetto.In this case, namespace scope can be thought of as project scope. Public gli elementi in un modulo, una classe o una struttura sono disponibili anche per qualsiasi progetto che fa riferimento al progetto.Public elements in a module, class, or structure are also available to any project that references their project.

Scelta dell'ambitoChoice of Scope

Quando si dichiara una variabile, è necessario tenere presenti i punti seguenti quando si sceglie l'ambito.When you declare a variable, you should keep in mind the following points when choosing its scope.

Vantaggi delle variabili localiAdvantages of Local Variables

Le variabili locali rappresentano una scelta ottimale per qualsiasi tipo di calcolo temporaneo, per i motivi seguenti:Local variables are a good choice for any kind of temporary calculation, for the following reasons:

  • Evitare conflitti di nomi.Name Conflict Avoidance. I nomi delle variabili locali non sono suscettibili ai conflitti.Local variable names are not susceptible to conflict. È ad esempio possibile creare diverse procedure contenenti una variabile denominata intTemp .For example, you can create several different procedures containing a variable called intTemp. Fino a quando ogni intTemp routine viene dichiarata come variabile locale, ogni procedura riconosce solo la propria versione di intTemp .As long as each intTemp is declared as a local variable, each procedure recognizes only its own version of intTemp. Qualsiasi procedura può modificare il valore nel relativo oggetto locale intTemp senza influire sulle intTemp variabili in altre routine.Any one procedure can alter the value in its local intTemp without affecting intTemp variables in other procedures.

  • Consumo di memoria.Memory Consumption. Le variabili locali utilizzano la memoria solo mentre è in esecuzione la relativa procedura.Local variables consume memory only while their procedure is running. La memoria viene rilasciata quando la procedura viene restituita al codice chiamante.Their memory is released when the procedure returns to the calling code. Al contrario, le variabili condivise e statiche utilizzano risorse di memoria fino a quando l'applicazione non viene arrestata, quindi utilizzarle solo quando necessario.By contrast, Shared and Static variables consume memory resources until your application stops running, so use them only when necessary. Le variabili di istanza utilizzano la memoria mentre la loro istanza continua a esistere, rendendole meno efficienti rispetto alle variabili locali, ma potenzialmente più efficienti delle Shared variabili o Static .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.

Riduzione dell'ambitoMinimizing Scope

In generale, quando si dichiara una variabile o una costante, è consigliabile fare in modo che l'ambito sia più stretto possibile (l'ambito del blocco è il più piccolo).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). Questo consente di conservare la memoria e ridurre al minimo le probabilità che il codice faccia riferimento erroneamente alla variabile non corretta.This helps conserve memory and minimizes the chances of your code erroneously referring to the wrong variable. Analogamente, è consigliabile dichiarare una variabile come statica solo quando è necessario mantenerne il valore tra le chiamate di routine.Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

Vedi ancheSee also