Istruzione Dim (Visual Basic)

Dichiara e alloca lo spazio di archiviazione per una o più variabili.

Sintassi

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

Parti

  • attributelist

    Facoltativo. Vedere Elenco degli attributi.

  • accessmodifier

    Facoltativo. Può essere uno dei seguenti:

    Vedere Access levels in Visual Basic.

  • Shared

    Facoltativo. Vedere Shared.

  • Shadows

    Facoltativo. Vedere Shadows.

  • Static

    Facoltativo. Vedere Static.

  • ReadOnly

    Facoltativo. Vedere ReadOnly.

  • WithEvents

    Facoltativo. Specifica che si tratta di variabili oggetto che fanno riferimento a istanze di una classe che può generare eventi. Vedere WithEvents.

  • variablelist

    Obbligatorio. Elenco di variabili dichiarate in questa istruzione.

    variable [ , variable ... ]

    Ogni variable presenta la sintassi e le parti seguenti:

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

    In parte Descrizione
    variablename Obbligatorio. Nome della variabile. Vedere Declared Element Names.
    boundslist Facoltativo. Elenco di limiti di ogni dimensione di una variabile di matrice.
    New Facoltativo. Crea una nuova istanza della classe quando viene eseguita l'istruzione Dim.
    datatype Facoltativo. Tipo di dati della variabile.
    With Facoltativo. Introduce l'elenco di inizializzatori di oggetti.
    propertyname Facoltativo. Nome di una proprietà nella classe di cui si sta creando un'istanza.
    propinitializer Obbligatorio dopo propertyname =. Espressione valutata e assegnata al nome della proprietà.
    initializer Facoltativo se New non è specificato. Espressione valutata e assegnata alla variabile al momento della creazione.

Osservazioni:

Il compilatore di Visual Basic usa l'istruzione Dim per determinare il tipo di dati della variabile e altre informazioni, ad esempio il codice che può accedere alla variabile. Nell'esempio seguente viene dichiarata una variabile che contenga un valore Integer.

Dim numberOfStudents As Integer

È possibile specificare qualsiasi tipo di dati o il nome di un'enumerazione, struttura, classe o interfaccia.

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

Per un tipo riferimento, usare la parola chiave New per creare una nuova istanza della classe o della struttura specificata dal tipo di dati. Se si usa New, non si usa un'espressione dell'inizializzatore. Gli argomenti, se necessari, vengono invece forniti al costruttore della classe da cui si sta creando la variabile.

Dim bottomLabel As New System.Windows.Forms.Label

È possibile dichiarare una variabile in una routine, un blocco, una classe, una struttura o un modulo. Non è possibile dichiarare una variabile in un file di origine, in uno spazio dei nomi o in un'interfaccia. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Una variabile dichiarata a livello di modulo, all'esterno di qualsiasi routine, è una variabile membro o un campo. Le variabili membro rientrano nell'ambito in tutta la classe, la struttura o il modulo. Una variabile dichiarata a livello di routine è una variabile locale. Le variabili locali rientrano nell'ambito solo nella relativa routine o blocco.

I modificatori di accesso seguenti vengono usati per dichiarare variabili all'esterno di una routine: Public, Protected, Friend, Protected Friend e Private. Per altre informazioni, vedere Livelli di accesso in Visual Basic.

La parola chiave Dim è facoltativa e in genere omessa se si specifica uno dei modificatori seguenti: Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly o WithEvents.

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Se Option Explicit è attivato (impostazione predefinita), il compilatore richiede una dichiarazione per ogni variabile usata. Per altre informazioni, vedere Istruzione Option Explicit.

Specifica di un valore iniziale

È possibile assegnare un valore a una variabile al momento della creazione. Per un tipo di valore, si usa un inizializzatore per fornire un'espressione da assegnare alla variabile. L'espressione deve restituire una costante che può essere calcolata in fase di compilazione.

Dim quantity As Integer = 10
Dim message As String = "Just started"

Se viene specificato un inizializzatore e un tipo di dati non viene specificato in una clausola As, l'inferenza del tipo viene usata per dedurre il tipo di dati dall'inizializzatore. Nell'esempio seguente, sia num1 che num2 sono fortemente tipizzati come tipi di dati Integer. Nella seconda dichiarazione, l'inferenza del tipo deduce il tipo dal valore 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

L'inferenza del tipo viene applicata a livello di routine. Non si applica all'esterno di una routine in una classe, una struttura, un modulo o un'interfaccia. Per altre informazioni sull'inferenza dei tipi, vedere Istruzione Option Infer e Inferenza del tipo di variabile locale.

Per informazioni su cosa accade quando non viene specificato un tipo di dati o un inizializzatore, vedere Tipi di dati e valori predefiniti più avanti in questo argomento.

È possibile usare un inizializzatore di oggetto per dichiarare istanze di tipi denominati e anonimi. Il codice seguente crea un'istanza di una classe Student e usa un inizializzatore di oggetto per inizializzare le proprietà.

Dim student1 As New Student With {.First = "Michael",
                                  .Last = "Tucker"}

Per altre informazioni sugli inizializzatori di oggetto, vedere Procedura: Dichiarare un oggetto usando un inizializzatore di oggetto, Inizializzatori di oggetto: tipi denominati e tipi anonimi e Tipi anonimi.

Dichiarazione di più variabili

È possibile dichiarare diverse variabili in un'istruzione di dichiarazione, specificando il nome della variabile per ognuno di essi e seguendo ogni nome di matrice con parentesi. Nel caso di più variabili, è possibile separarle mediante virgole.

Dim lastTime, nextTime, allTimes() As Date

Se si dichiarano più variabili con una clausola As, non è possibile fornire un inizializzatore per tale gruppo di variabili.

È possibile specificare tipi di dati diversi per variabili diverse usando una clausola As separata per ogni variabile dichiarata. Ogni variabile accetta il tipo di dati specificato nella prima clausola As rilevata dopo la relativa parte variablename.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double

Matrici

È possibile dichiarare una variabile per contenere una matrice, che può contenere più valori. Per specificare che una variabile contiene una matrice, inserire le parentesi immediatamente dopo variablename. Per altre informazioni sulle matrici, vedere Matrici.

È possibile specificare il limite inferiore e superiore di ogni dimensione di una matrice. A tale scopo, includere boundslist all'interno delle parentesi. Per ogni dimensione, boundslist specifica il limite superiore e facoltativamente il limite inferiore. Il limite inferiore è sempre zero, indipendentemente dal fatto che venga specificato o meno. Ogni indice può variare da zero al relativo valore del limite superiore.

Le due istruzioni seguenti sono equivalenti. Ogni istruzione dichiara una matrice di 21 elementi Integer. Quando si accede alla matrice, l'indice può variare da 0 a 20.

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

L'istruzione seguente dichiara una matrice bidimensionale di tipo Double. La matrice ha 4 righe (3 + 1) di 6 colonne (5 + 1) ognuna. Si noti che un limite superiore rappresenta il valore massimo possibile per l'indice, non la lunghezza della dimensione. La lunghezza della dimensione è il limite superiore più uno.

Dim matrix2(3, 5) As Double

Una matrice può avere da 1 a 32 dimensioni.

È possibile lasciare vuoti tutti i limiti in una dichiarazione di matrice. In questo caso, la matrice ha il numero di dimensioni specificate, ma non è inizializzata. Ha un valore di Nothing fino a quando non si inizializzano almeno alcuni dei suoi elementi. L'istruzione Dim deve specificare i limiti per tutte le dimensioni o per nessuna.

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

Se la matrice ha più di una dimensione, è necessario includere virgole tra le parentesi per indicare il numero di dimensioni.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

È possibile dichiarare una matrice di lunghezza zero dichiarando che una delle dimensioni della matrice è pari a -1. Il valore di una variabile che contiene una matrice di lunghezza zero non è Nothing. Le matrici di lunghezza zero sono richieste da determinate funzioni di Common Language Runtime. Se si tenta di accedere a una matrice di questo tipo, si verifica un'eccezione di runtime. Per altre informazioni, vedere Matrici.

È possibile inizializzare i valori di una matrice usando un valore letterale di matrice. A tale scopo, racchiudere i valori di inizializzazione tra parentesi graffe ({}).

Dim longArray() As Long = {0, 1, 2, 3}

Per le matrici multidimensionali, l'inizializzazione per ogni dimensione separata è racchiusa tra parentesi graffe nella dimensione esterna. Gli elementi vengono specificati in ordine per lunghezza di riga.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Per altre informazioni sui valori letterali delle matrici, vedere Matrici.

Tipi di dati e valori predefiniti

Nella tabella seguente vengono descritti i risultati di varie combinazioni della specifica del tipo di dati e dell'inizializzatore in un'istruzione Dim.

Tipo di dati specificato? Inizializzatore specificato? Esempio Risultato
No No Dim qty Se Option Strict è disabilitato (impostazione predefinita), la variabile è impostata su Nothing.

Se Option Strict è abilitato, si verifica un errore in fase di compilazione.
No Dim qty = 5 Se Option Infer è abilitato (impostazione predefinita), alla variabile viene assegnato il tipo di dati dell'inizializzatore. Vedere Inferenza del tipo di variabile locale.

Se le istruzioni Option Infer e Option Strict sono disabilitate, il tipo di dati accettato dalla variabile è Object.

Se Option Infer è disabilitato e Option Strict è abilitato, si verifica un errore in fase di compilazione.
No Dim qty As Integer La variabile viene inizializzata sul valore predefinito per il tipo di dati. Vedere la tabella più avanti in questa sezione.
Dim qty As Integer = 5 Se il tipo di dati dell'inizializzatore non è convertibile nel tipo di dati specificato, si verifica un errore in fase di compilazione.

Se si specifica un tipo di dati ma non si specifica un inizializzatore, Visual Basic inizializza la variabile sul valore predefinito per il relativo tipo di dati. Nella tabella seguente vengono illustrati i valori di inizializzazione predefiniti.

Tipo di dati Valore predefinito
Tutti i tipi numerici (inclusi Byte e SByte) 0
Char Binario 0
Tutti i tipi di riferimento (inclusi Object, String e tutte le matrici) Nothing
Boolean False
Date 12:00 del 1° gennaio dell'anno 1 (01/01/0001 12:00:00 AM)

Ogni elemento di una struttura viene inizializzato come se fosse una variabile separata. Se si dichiara la lunghezza di una matrice ma non si inizializzano i relativi elementi, ogni elemento viene inizializzato come se fosse una variabile separata.

Durata della variabile locale Static

Una variabile locale Static ha una durata superiore a quella della routine in cui viene dichiarata. I limiti della durata della variabile dipendono dalla posizione in cui viene dichiarata la routine e dal fatto che sia di tipo Shared.

Dichiarazione di routine Variabile inizializzata La variabile non esiste più
In un modulo La prima volta che viene chiamata la routine Quando il programma arresta l'esecuzione
In una classe o struttura, la routine è Shared La prima volta che la routine viene chiamata in un'istanza specifica o nella classe o nella struttura stessa Quando il programma arresta l'esecuzione
In una classe o in una struttura, la routine è Shared La prima volta che viene chiamata la routine in un'istanza specifica Quando l'istanza viene rilasciata per Garbage Collection (GC)

Attributi e modificatori

È possibile applicare gli attributi solo alle variabili membro, non alle variabili locali. Un attributo contribuisce a ottenere informazioni sui metadati dell'assembly che non sono significative per l'archiviazione temporanea, ad esempio le variabili locali.

A livello di modulo, non è possibile usare il modificatore Static per dichiarare le variabili membro. A livello di routine, non è possibile usare Shared, Shadows, ReadOnly, WithEvents o i modificatori di accesso per dichiarare le variabili locali.

È possibile specificare il codice che può accedere a una variabile fornendo accessmodifier. Per impostazione predefinita, le variabili membro della classe e del modulo (all'esterno di qualsiasi routine) hanno accesso privato e le variabili membro della struttura hanno accesso pubblico. È possibile regolare i livelli di accesso con i modificatori di accesso. Non è possibile usare i modificatori di accesso nelle variabili locali (all'interno di una routine).

È possibile specificare WithEvents solo sulle variabili membro, non sulle variabili locali all'interno di una routine. Se si specifica WithEvents, il tipo di dati della variabile deve essere un tipo di classe specifico, non Object. Non è possibile dichiarare una matrice con WithEvents. Per altre informazioni sugli eventi, vedere Eventi.

Nota

Il codice esterno a una classe, una struttura o un modulo deve qualificare il nome di una variabile membro con il nome di tale classe, struttura o modulo. Il codice all'esterno di una routine o di un blocco non può fare riferimento ad alcuna variabile locale all'interno di tale routine o blocco.

Rilascio delle risorse gestite

Il Garbage Collector di .NET Framework elimina le risorse gestite senza che l'utente debba scrivere codice aggiuntivo. Tuttavia, è possibile forzare l'eliminazione di una risorsa gestita anziché attendere il Garbage Collector.

Se una classe è in possesso di una risorsa particolarmente preziosa e rara, ad esempio una connessione di database o un handle di file, potrebbe non essere necessario attendere che la successiva Garbage Collection pulisca un'istanza di classe che non è più in uso. Una classe può implementare l'interfaccia IDisposable per fornire un modo per rilasciare le risorse prima di un'operazione di Garbage Collection. Una classe che implementa tale interfaccia espone un metodo Dispose che può essere chiamato per forzare il rilascio immediato delle risorse preziose.

L'istruzione Using automatizza il processo di acquisizione di una risorsa, l'esecuzione di un set di istruzioni e l'eliminazione della risorsa. Tuttavia, la risorsa deve implementare l'interfaccia IDisposable. Per altre informazioni, vedere Istruzione using.

Esempio 1

Nell'esempio seguente vengono dichiarate variabili usando l'istruzione Dim con varie opzioni.

' Declare and initialize a Long variable.
Dim startingAmount As Long = 500

' Declare a local variable that always retains its value,
' even after its procedure returns to the calling code.
Static totalSales As Double

' Declare a variable that refers to an array.
Dim highTemperature(31) As Integer

' Declare and initialize an array variable that
' holds four Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

Esempio 2

Nell'esempio seguente vengono elencati i numeri primi compresi tra 1 e 30. L'ambito delle variabili locali è descritto nei commenti del codice.

Public Sub ListPrimes()
    ' The sb variable can be accessed only
    ' within the ListPrimes procedure.
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only
    ' within the For...Next block.  A different
    ' variable with the same name could be declared
    ' outside of the For...Next block.
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29
End Sub

Private Function CheckIfPrime(ByVal number As Integer) As Boolean
    If number < 2 Then
        Return False
    Else
        ' The root and highCheck variables can be accessed
        ' only within the Else block.  Different variables
        ' with the same names could be declared outside of
        ' the Else block.
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within
        ' the For...Next block.
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then
                Return False
            End If
        Next

        Return True
    End If
End Function

Esempio 3

Nell'esempio seguente la variabile speedValue viene dichiarata a livello di classe. La parola chiave Private viene usata per dichiarare la variabile. È possibile accedere alla variabile tramite qualsiasi routine nella classe Car.

' Create a new instance of a Car.
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by
    ' any procedure in the Car class.
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer
        Get
            Return speedValue
        End Get
    End Property

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub
End Class

Vedi anche