Istruzione Dim (Visual Basic)

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

Sintassi

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

Parti

  • attributelist

    facoltativo. Vedere Elenco attributi.

  • accessmodifier

    facoltativo. Può essere uno dei seguenti:

    Vedere Livelli di accesso in Visual Basic.

  • Shared

    facoltativo. Vedere Condiviso.

  • Shadows

    facoltativo. Vedi Ombreggiature.

  • Static

    facoltativo. Vedere Statico.

  • ReadOnly

    facoltativo. Vedere ReadOnly.

  • WithEvents

    facoltativo. Specifica che si tratta di variabili oggetto che fanno riferimento a istanze di una classe che possono 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 ]

    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.

Commenti

Il compilatore 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 per contenere un Integer valore.

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 New parola chiave per creare una nuova istanza della classe o della struttura specificata dal tipo di dati . Se si usa New, non si usa un'espressione di inizializzatore. Specificare invece gli argomenti, se necessari, 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 o un campo membro. Le variabili membro rientrano nell'ambito di tutta la classe, la struttura o il modulo. Una variabile dichiarata a livello di routine è una variabile locale. Le variabili locali si trovano nell'ambito solo all'interno della relativa routine o blocco.

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

La Dim parola chiave è facoltativa e in genere omessa se si specifica uno dei modificatori seguenti: Public, Protected, Friend, PrivateShadowsSharedStaticProtected FriendReadOnlyo .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 Option Explicit Statement.

Specifica di un valore iniziale

È possibile assegnare un valore a una variabile al momento della creazione. Per un tipo 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 non viene specificato un tipo di dati in una As clausola, l'inferenza del tipo viene usata per dedurre il tipo di dati dall'inizializzatore. Nell'esempio seguente, sia che num1num2 sono fortemente tipizzato come numeri interi. 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 si applica a livello di routine. Non si applica all'esterno di una routine in una classe, struttura, modulo o interfaccia. Per altre informazioni sull'inferenza dei tipi, vedere Option Infer Statement e Local Type Inference.

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 oggetti per dichiarare istanze di tipi denominati e anonimi. Il codice seguente crea un'istanza di una Student classe 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 oggetti, vedere Procedura: Dichiarare un oggetto tramite un inizializzatore di oggetto, inizializzatori di oggetto: tipi denominati e 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 As clausola, non è possibile fornire un inizializzatore per tale gruppo di variabili.

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

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, seguire variablename immediatamente le parentesi. Per altre informazioni sulle matrici, vedere Matrici.

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

Le due istruzioni seguenti sono equivalenti. Ogni istruzione dichiara una matrice di 21 Integer elementi. 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 più alto 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. Se si esegue questa operazione, la matrice ha il numero di dimensioni specificate, ma non inizializza. Ha un valore di Nothing fino a quando non si inizializza almeno alcuni dei relativi elementi. L'istruzione Dim deve specificare i limiti per tutte le dimensioni o per nessuna dimensione.

' 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 a lunghezza zero dichiarando che una delle dimensioni della matrice deve essere -1. Una variabile che contiene una matrice a lunghezza zero non ha il valore Nothing. Le matrici a lunghezza zero sono necessarie da determinate funzioni di Common Language Runtime. Se si tenta di accedere a tale matrice, si verifica un'eccezione di runtime. Per altre informazioni, vedere Matrici.

È possibile inizializzare i valori di una matrice usando un valore letterale della matrice. A tale scopo, circondare i valori di inizializzazione con 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 nell'ordine principale della riga.

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

Per altre informazioni sui valori letterali della matrice, 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 è disattivato (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 è attivo (impostazione predefinita), la variabile accetta il tipo di dati dell'inizializzatore. Vedere Inferenza del tipo 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 al valore predefinito per il tipo di dati. La tabella seguente mostra 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, Stringe tutte le matrici) Nothing
Boolean False
Date 12:00 AM del 1 gennaio 1 dell'anno (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 inizializza gli elementi, ogni elemento viene inizializzato come se fosse una variabile separata.

Durata variabile locale statica

Una Static variabile locale ha una durata superiore a quella della procedura in cui viene dichiarata. I limiti della durata della variabile dipendono dalla posizione in cui viene dichiarata la routine e se è Shared.

Dichiarazione di procedura Variabile inizializzata La variabile arresta esistente
In un modulo La prima volta che viene chiamata la procedura Quando il programma arresta l'esecuzione
In una classe o in una struttura, la procedura è Shared La prima volta che la procedura 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 procedura non è Shared La prima volta che viene chiamata la procedura in un'istanza specifica Quando l'istanza viene rilasciata per Garbage Collection (GC)

Attributi e modificatori

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

A livello di modulo non è possibile usare il Static modificatore per dichiarare le variabili membro. A livello di procedura, non è possibile usare Shared, Shadows, ReadOnly, WithEventso eventuali modificatori di accesso per dichiarare variabili locali.

È possibile specificare il codice che può accedere a una variabile fornendo un accessmodifieroggetto . Variabili membro della classe e del modulo (all'esterno di qualsiasi procedura) predefinite per l'accesso privato e variabili membro della struttura predefinite per l'accesso pubblico. È possibile modificare 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 a qualsiasi variabile locale all'interno di tale procedura o blocco.

Rilascio di risorse gestite

L'.NET Framework Garbage Collector elimina le risorse gestite senza alcun codice aggiuntivo nella propria parte. Tuttavia, è possibile forzare l'smaltimento di una risorsa gestita anziché attendere il Garbage Collector.

Se una classe si trova in una risorsa particolarmente preziosa e scarsa (ad esempio una connessione al database o un handle di file), potrebbe non essere necessario attendere fino alla successiva Garbage Collection per pulire 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 una Garbage Collection. Classe che implementa tale interfaccia espone un Dispose metodo che può essere chiamato per forzare immediatamente il rilascio di risorse preziose.

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

Esempio 1

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

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

' Declare a variable that refers to a Button object,
' create a Button object, and assign the Button object
' to the variable.
Dim switchButton As New System.Windows.Forms.Button

' 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 sono elencati i numeri primi compresi tra 1 e 30. L'ambito delle variabili locali è descritto nei commenti di 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 speedValue variabile viene dichiarata a livello di classe. La Private parola chiave viene usata per dichiarare la variabile. La variabile può essere accessibile da qualsiasi procedura nella Car classe.

' 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