Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dichiara e alloca lo spazio di archiviazione per una o più variabili.
Sintassi
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist
Parti
attributelistOpzionale. Vedere Elenco attributi.
accessmodifierOpzionale. Può essere uno dei seguenti:
SharedOpzionale. Vedere Shared.
ShadowsOpzionale. Vedi Ombre.
StaticOpzionale. Vedere Statico.
ReadOnlyOpzionale. Vedere ReadOnly.
WithEventsOpzionale. Specifica che si tratta di variabili oggetto che fanno riferimento a istanze di una classe che possono generare eventi. Vedere WithEvents.
variablelistObbligatorio. Elenco di variabili dichiarate in questa istruzione.
variable [ , variable ... ]Ogni
variablepresenta la sintassi e le parti seguenti:variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]Parte Descrizione variablenameObbligatorio. Nome della variabile. Vedere Nomi di elementi dichiarati. boundslistOpzionale. Elenco di limiti di ogni dimensione di una variabile di matrice. NewOpzionale. Crea una nuova istanza della classe quando viene eseguita l'istruzione Dim.datatypeOpzionale. Tipo di dati della variabile. WithOpzionale. Introduce l'elenco di inizializzatori di oggetti. propertynameOpzionale. Nome di una proprietà nella classe di cui si sta creando un'istanza. propinitializerObbligatorio dopo propertyname=. Espressione valutata e assegnata al nome della proprietà.initializerFacoltativo se Newnon è 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 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. 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 di dichiarazione 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 in 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 FriendProtectedFriend, , 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, Protected FriendShadowsFriendSharedStaticPrivateReadOnlyo .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.For more information, see Option Explicit Statement.
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 As clausola, l'inferenza del tipo viene usata per dedurre il tipo di dati dall'inizializzatore. Nell'esempio seguente, sia num1 che num2 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 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 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 oggetto 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. Più variabili sono separate da 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 venga 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 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 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 di lunghezza zero dichiarando una delle dimensioni della matrice come -1. Una variabile che contiene una matrice di lunghezza zero non ha il valore 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 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 in ordine principale di riga.
Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
Per altre informazioni sui valori letterali di matrice, vedere Matrici.
Tipi di dati e valori predefiniti
Nella tabella seguente vengono descritti i risultati di varie combinazioni di specificare il tipo di dati e l'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 viene impostata su Nothing.Se Option Strict è attivato, si verifica un errore in fase di compilazione. |
| NO | Sì | Dim qty = 5 |
Se Option Infer è attivato (impostazione predefinita), la variabile accetta il tipo di dati dell'inizializzatore. Vedere Inferenza del tipo locale. Se Option Infer è disattivato e Option Strict è disattivato, la variabile accetta il tipo di dati di Object.Se Option Infer è disattivato ed Option Strict è attivo, si verifica un errore in fase di compilazione. |
| Sì | 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. |
| Sì | Sì | 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, Stringe tutte le matrici) |
Nothing |
Boolean |
False |
Date |
12:00 del 1° gennaio 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 si inizializzano i relativi 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 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 Shared.
| Dichiarazione di procedura | Variabile inizializzata | La variabile arresta la variabile esistente |
|---|---|---|
| In un modulo | La prima volta che la procedura viene chiamata | 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 non è 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 attributi solo alle variabili membro, non alle variabili locali. Un attributo contribuisce alle informazioni ai 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 routine, non è possibile usare Shared, ShadowsReadOnly, , WithEventso i modificatori di accesso per dichiarare le variabili locali.
È possibile specificare il codice che può accedere a una variabile fornendo un oggetto accessmodifier. Le variabili membro di classe e modulo (all'esterno di qualsiasi routine) vengono usate per impostazione predefinita per l'accesso privato e le variabili membro della struttura vengono usate per impostazione predefinita per l'accesso pubblico. È possibile regolare i livelli di accesso con i modificatori di accesso. Non è possibile usare 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.
Annotazioni
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 esterno a una routine o a un blocco non può fare riferimento a variabili locali all'interno di tale routine o blocco.
Rilascio di risorse gestite
.NET Framework Garbage Collector elimina le risorse gestite senza 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 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 un'operazione di Garbage Collection. Classe che implementa tale interfaccia espone un Dispose metodo che può essere chiamato per forzare il rilascio immediato di 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 speedValue variabile viene dichiarata a livello di classe. La Private parola chiave viene usata per dichiarare la variabile. È possibile accedere alla variabile tramite qualsiasi routine 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
Vedere anche
- Istruzione Const
- Istruzione ReDim
- Istruzione Option Explicit
- Istruzione Option Infer
- Istruzione Option Strict
- pagina di compilazione, Progettazione progetti (Visual Basic)
- Dichiarazione di variabile
- matrici
- Inizializzatori di oggetti: tipi denominati e anonimi
- Tipi anonimi
- Inizializzatori di oggetti: tipi denominati e anonimi
- Procedura: Dichiarare un oggetto utilizzando un inizializzatore di oggetto
- Inferenza del tipo locale