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 e Loop

  • For [Each] e Next

  • If e End If

  • Select e End Select

  • SyncLock e End SyncLock

  • Try e End Try

  • While e End While

  • With e End 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 oggetto intTemp viene dichiarato come variabile locale, ogni routine riconosce solo la propria versione di intTemp. Qualsiasi routine può modificare il valore della relativa variabile locale intTemp senza influire sulle variabili intTemp 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 o Static.

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.

Vedi anche