Ambito in Visual Basic
L'ambito di un elemento dichiarato è l'insieme di tutto il codice che può farvi riferimento senza qualificarne il nome o renderlo disponibile tramite un'istruzione Imports (spazio dei nomi e tipo .NET). Un elemento può avere un ambito a uno dei livelli seguenti:
Livello | Descrizione |
---|---|
Ambito blocco | Disponibile solo all'interno del blocco di codice in cui è dichiarato |
Ambito routine | Disponibile per tutto il codice all'interno della routine in cui è dichiarato |
Ambito modulo | Disponibile per tutto il codice all'interno del modulo, della classe o della struttura in cui è dichiarato |
Ambito spazio dei nomi | Disponibile per tutto il codice nello spazio dei nomi in cui è dichiarato |
Questi livelli di ambito vanno dal più ristretto (blocco) al più ampio (spazio dei nomi), dove per ambito più ristretto si intende il più piccolo insieme di codice che può fare riferimento all'elemento senza qualificazione. Per altre informazioni, vedere "Livelli di ambito" in questa pagina.
Specifica dell'ambito e definizione delle variabili
L'ambito di un elemento viene specificato quando lo si dichiara. L'ambito può dipendere dai fattori seguenti:
Area (blocco, routine, modulo, classe o struttura) in cui si dichiara l'elemento
Spazio dei nomi contenente la dichiarazione dell'elemento
Livello di accesso dichiarato per l'elemento
Prestare attenzione quando si definiscono variabili con lo stesso nome ma con un ambito diverso, perché ciò può causare risultati imprevisti. Per altre informazioni, vedere References to Declared Elements.
Livelli di ambito
Un elemento di programmazione è disponibile in tutta l'area in cui viene dichiarato. Tutto il codice nella stessa area può fare riferimento all'elemento senza qualificarne il nome.
Ambito blocco
Un blocco è un set di istruzioni racchiuse all'interno di istruzioni di dichiarazione di inizio e fine, come le seguenti:
Do
eLoop
For
[Each
] eNext
If
eEnd If
Select
eEnd Select
SyncLock
eEnd SyncLock
Try
eEnd Try
While
eEnd While
With
eEnd With
Se si dichiara una variabile all'interno di un blocco, è possibile usarla solo all'interno di tale blocco. Nell'esempio seguente l'ambito della variabile integer cube
è il blocco tra If
e End If
e non è più possibile fare riferimento a cube
quando l'esecuzione esce dal blocco.
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 è comunque quella dell'intera routine. Se si accede al blocco più volte durante la routine, ogni variabile del blocco mantiene il valore precedente. Per evitare risultati imprevisti in questo caso, è consigliabile inizializzare le variabili del blocco all'inizio del blocco.
Ambito routine
Un elemento dichiarato all'interno di una routine non è disponibile al di fuori di tale routine. Solo la routine che contiene la dichiarazione può usarlo. Le variabili a questo livello sono note anche come variabili locali. Vengono dichiarate con l'istruzione Dim, con o senza la parola chiave Static.
L'ambito routine e l'ambito blocco sono strettamente correlati. Se si dichiara una variabile all'interno di una routine ma al di fuori di qualsiasi blocco all'interno di tale routine, si può pensare che la variabile abbia un ambito blocco, dove il blocco è l'intera routine.
Nota
Tutti gli elementi locali, anche se sono variabili Static
, sono privati della routine in cui vengono visualizzati. Non è possibile dichiarare alcun elemento utilizzando la parola chiave Public all'interno di una routine.
Ambito modulo
Per praticità, il livello di modulo del singolo termine si applica ugualmente a moduli, classi e strutture. È possibile dichiarare elementi a questo livello inserendo l'istruzione di dichiarazione al d fuori di qualsiasi routine o blocco, ma all'interno del modulo, della classe o della struttura.
Quando si crea una dichiarazione a livello di modulo, il livello di accesso scelto determina l'ambito. Anche lo spazio dei nomi che contiene il modulo, la classe o la struttura influisce sull'ambito.
Gli elementi per i quali si dichiara il livello di accesso privato sono disponibili per ogni routine di tale modulo, ma non per il codice di un altro modulo. L'istruzione Dim
a livello di modulo usa come impostazione predefinita Private
se non si usano parole chiave a livello di accesso. Tuttavia, è possibile rendere più evidenti l'ambito e il livello di accesso usando la parola chiave Private
nell'istruzione Dim
.
Nell'esempio seguente tutte le routine definite nel modulo possono fare riferimento alla variabile stringa strMsg
. Quando viene chiamata la seconda routine, viene visualizzato il contenuto della variabile stringa strMsg
in una finestra di dialogo.
' 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 spazio dei nomi
Se si dichiara un elemento a livello di modulo usando la parola chiave Friend o Public, diventa disponibile per tutte le routine dello spazio dei nomi in cui viene dichiarato l'elemento. Con la modifica seguente all'esempio precedente, il codice può fare riferimento alla variabile stringa strMsg
in qualsiasi punto dello spazio dei nomi della relativa dichiarazione.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
L'ambito spazio dei nomi include spazi dei nomi annidati. Un elemento disponibile all'interno di uno spazio dei nomi è disponibile anche all'interno di qualsiasi spazio dei nomi annidato all'interno di tale spazio dei nomi.
Se il progetto non contiene istruzioni Namespace, tutti gli elementi del progetto si trovano nello stesso spazio dei nomi. In questo caso, l'ambito spazio dei nomi può essere considerato come ambito del progetto. Gli elementi Public
di un modulo, una classe o una struttura sono disponibili anche per qualsiasi progetto che faccia riferimento al progetto.
Scelta dell'ambito
Quando si dichiara una variabile, è necessario tenere presenti i punti seguenti quando si sceglie il relativo ambito.
Vantaggi delle variabili locali
Le variabili locali sono una buona scelta per qualsiasi tipo di calcolo temporaneo, per i motivi seguenti:
Evitare conflitti di nomi. I nomi delle variabili locali non sono soggetti a conflitti. Ad esempio, è possibile creare diverse routine contenenti una variabile denominata
intTemp
. Finché ogni oggettointTemp
viene dichiarato come variabile locale, ogni routine riconosce solo la propria versione diintTemp
. Qualsiasi routine può modificare il valore della relativa variabile localeintTemp
senza influire sulle variabiliintTemp
di altre procedure.Consumo di memoria. Le variabili locali consumano memoria solo durante l'esecuzione della routine. La memoria viene rilasciata quando la routine torna al codice chiamante. Al contrario, le variabili Shared e Static consumano risorse di memoria fino a quando l'applicazione non viene arrestata, quindi usarle solo quando necessario. Le variabili di istanza consumano memoria mentre l'istanza continua a esistere, rendendole meno efficienti delle variabili locali, ma potenzialmente più efficienti delle variabili
Shared
oStatic
.
Riduzione dell'ambito
In generale, quando si dichiara una variabile o una costante, è consigliabile rendere l'ambito il più ristretto possibile (l'ambito blocco è il più ristretto). In questo modo è possibile risparmiare memoria e ridurre al minimo le probabilità che il codice faccia erroneamente riferimento alla variabile errata. Analogamente, è necessario dichiarare una variabile come Static solo quando è necessario conservarne il valore tra le chiamate di routine.