Condividi tramite


Ambito 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 (spazio dei nomi.NET e tipo). Un elemento può avere un ambito a uno dei livelli seguenti:

Livello Descrizione
Ambito di blocco Disponibile solo all'interno del blocco di codice in cui è dichiarato
Ambito della procedura Disponibile per tutto il codice all'interno della procedura in cui è dichiarata
Ambito del modulo Disponibile per tutto il codice all'interno del modulo, della classe o della struttura in cui è dichiarato
Ambito del namespace Disponibile per tutto il codice nello spazio dei nomi in cui è dichiarato

Questi livelli di avanzamento dell'ambito dal più stretto (blocco) al più ampio (spazio dei nomi), dove l'ambito più stretto indica il set di codice più piccolo che può fare riferimento all'elemento senza qualifica. Per altre informazioni, vedere "Livelli di ambito" in questa pagina.

Specificare l'ambito e definire le variabili

Specificare l'ambito di un elemento quando lo dichiari. 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 un ambito diverso, perché ciò può causare risultati imprevisti. Per altre informazioni, vedere Riferimenti agli elementi dichiarati.

Livelli di ambito

Un elemento di programmazione è disponibile in tutta l'area in cui la dichiari. Tutto il codice nella stessa area può fare riferimento all'elemento senza qualificarne il nome.

Ambito di blocco

Un blocco è un set di istruzioni racchiuse all'interno di istruzioni di dichiarazione di avvio e terminazione, ad esempio 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 cube integer è il blocco tra If e End Ife e non è più possibile fare riferimento a cube quando l'esecuzione supera il blocco.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

Annotazioni

Anche se l'ambito di una variabile è limitato a un blocco, la sua durata è comunque quella dell'intera procedura. Se si immette il blocco più volte durante la procedura, ogni variabile di blocco mantiene il valore precedente. Per evitare risultati imprevisti in questo caso, è consigliabile inizializzare le variabili di blocco all'inizio del blocco.

Ambito procedura

Un elemento dichiarato all'interno di una routine non è disponibile all'esterno di tale procedura. Solo la routine che contiene la dichiarazione può usarla. Le variabili a questo livello sono note anche come variabili locali. Le dichiari tramite l'istruzione Dim, sia con che senza la parola chiave Static.

L'ambito delle procedure e dei blocchi sono strettamente correlati. Se si dichiara una variabile all'interno di una routine ma all'esterno di qualsiasi blocco all'interno di tale routine, è possibile considerare la variabile come l'ambito del blocco, in cui il blocco è l'intera procedura.

Annotazioni

Tutti gli elementi locali, anche se sono Static variabili, sono privati della procedura in cui vengono visualizzati. Non è possibile dichiarare alcun elemento utilizzando la parola chiave Public all'interno di una routine.

Ambito del modulo

Per praticità, il livello di modulo a termine singolo si applica allo stesso modo a moduli, classi e strutture. È 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.

Quando si crea una dichiarazione a livello di modulo, il livello di accesso scelto determina l'ambito. Lo spazio dei nomi che contiene il modulo, la classe o la struttura influisce anche 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 qualsiasi codice in un modulo diverso. L'istruzione Dim a livello di modulo assume Private per impostazione predefinita se non si utilizzano parole chiave di livello di accesso. Tuttavia, è possibile rendere più ovvio l'ambito e il livello di accesso usando la Private parola chiave nell'istruzione Dim .

Nell'esempio seguente tutte le procedure definite nel modulo possono fare riferimento alla variabile strMsgstringa . Quando viene chiamata la seconda routine, viene visualizzato il contenuto della variabile strMsg stringa 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 dello spazio dei nomi

Se si dichiara un elemento a livello di modulo usando la parola chiave Friend o Public , diventa disponibile per tutte le procedure nello spazio dei nomi in cui viene dichiarato l'elemento. Con la modifica seguente all'esempio precedente, la variabile stringa strMsg può essere richiamata dal codice 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 dello 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 dello spazio dei nomi, tutti gli elementi del progetto si trovano nello stesso spazio dei nomi. In questo caso, l'ambito dello spazio dei nomi può essere considerato come ambito del progetto. Public gli elementi di un modulo, una classe o una struttura sono disponibili anche per qualsiasi progetto che faccia riferimento al loro 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 procedure contenenti una variabile denominata intTemp. Purché ogni intTemp oggetto venga dichiarato come variabile locale, ogni routine riconosce solo la propria versione di intTemp. Qualsiasi routine può modificare il valore nel relativo locale intTemp senza influire sulle intTemp variabili in altre procedure.

  • Utilizzo della memoria. Le variabili locali utilizzano memoria solo durante l'esecuzione della routine. La memoria viene rilasciata quando la routine torna al codice chiamante. Al contrario, le variabili condivise e statiche utilizzano risorse di memoria fino a quando l'applicazione non viene arrestata , quindi usarle solo quando necessario. Le variabili di istanza usano memoria mentre l'istanza continua a esistere, rendendole meno efficienti delle variabili locali, ma potenzialmente più efficienti di Shared o Static variabili.

Riduzione dell'ambito

In generale, quando si dichiara una variabile o una costante, è consigliabile fare in modo che l'ambito sia il più piccolo possibile (l'ambito del blocco è il più piccolo). 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 Statica solo quando è necessario conservarne il valore tra le chiamate di routine.

Vedere anche