Inferenza del tipo di variabile locale (Visual Basic)
Il compilatore di Visual Basic usa l'inferenza del tipo per determinare i tipi di dati delle variabili locali dichiarate senza una clausola As
. Il compilatore deduce il tipo della variabile in base al tipo dell'espressione di inizializzazione. In questo modo è possibile dichiarare le variabili senza specificare in modo esplicito un tipo, come illustrato nell'esempio seguente. In seguito alle dichiarazioni, sia num1
che num2
sono fortemente tipizzati come Integer.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Nota
Se non si desidera che num2
nell'esempio precedente sia tipizzato come Integer
, è possibile specificare un altro tipo usando una dichiarazione come Dim num3 As Object = 3
o Dim num4 As Double = 3
.
Nota
L'inferenza del tipo può essere usata solo per le variabili locali non statiche e non può essere usata per determinare il tipo di campi di classe, proprietà o funzioni.
L'inferenza del tipo di variabile locale viene applicata a livello di routine. Non può essere usata per dichiarare variabili a livello di modulo (all'interno di una classe, una struttura, un modulo o un'interfaccia, ma non all'interno di una routine o di un blocco). Se num2
nell'esempio precedente fosse un campo di una classe anziché una variabile locale in una routine, la dichiarazione genererebbe un errore con la modalità Option Strict
On e classificherebbe num2
come Object
con la modalità Option Strict
Off. Analogamente, l'inferenza del tipo di variabile locale non si applica alle variabili a livello di routine dichiarate come Static
.
Inferenza del tipo e associazione tardiva
Il codice che usa l'inferenza del tipo è simile al codice che si basa sull'associazione tardiva. Tuttavia, l'inferenza del tipo genera una variabile fortemente tipizzata anziché lasciarla come Object
. Il compilatore usa l'inizializzatore di una variabile per determinare il tipo della variabile in fase di compilazione per generare codice con associazione anticipata. Nell'esempio precedente la variabile num2
, come num1
, è tipizzata come Integer
.
Il comportamento delle variabili con associazione anticipata è diverso da quello delle variabili ad associazione tardiva, in cui il tipo è noto solo in fase di esecuzione. Conoscere il tipo in anticipo consente al compilatore di identificare i problemi prima dell'esecuzione, allocare con precisione la memoria ed eseguire altre ottimizzazioni. L'associazione anticipata consente anche all'ambiente di sviluppo integrato (IDE) di Visual Basic di fornire la Guida di IntelliSense sui membri di un oggetto. L'associazione anticipata è preferibile anche per le prestazioni. Questo perché per tutti i dati archiviati in una variabile con associazione tardiva viene eseguito il wrapping come tipo Object
e l'accesso ai membri del tipo in fase di esecuzione rallenta il programma.
Esempi
L'inferenza del tipo si verifica quando una variabile locale viene dichiarata senza una clausola As
e inizializzata. Il compilatore usa il tipo del valore iniziale assegnato come tipo della variabile. Ad esempio, ognuna delle righe di codice seguenti dichiara una variabile di tipo String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
Il codice seguente illustra due modi equivalenti per creare una matrice di interi.
' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}
' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}
È utile usare l'inferenza del tipo per determinare il tipo di una variabile di controllo del ciclo. Nel codice seguente il compilatore deduce che number
è Integer
perché someNumbers2
nell'esempio precedente è una matrice di interi.
Dim total = 0
For Each number In someNumbers2
total += number
Next
L'inferenza del tipo di variabile locale può essere usata nelle istruzioni Using
per stabilire il tipo del nome della risorsa, come illustrato nell'esempio seguente.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
Il tipo di una variabile può anche essere dedotto dai valori restituiti delle funzioni, come illustrato nell'esempio seguente. Sia pList1
che pList2
sono matrici di processi perché Process.GetProcesses
restituisce una matrice di processi.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Option Infer
Option Infer
consente di specificare se l'inferenza del tipo di variabile locale è consentita in un file specifico. Per abilitare o bloccare l'opzione, digitare una delle istruzioni seguenti all'inizio del file.
Option Infer On
Option Infer Off
Se non si specifica un valore per Option Infer
nel codice, il valore predefinito del compilatore è Option Infer On
.
Se il valore impostato per Option Infer
in un file è in conflitto con il valore impostato nell'IDE o sulla riga di comando, il valore nel file ha precedenza.
Per altre informazioni, vedere Istruzione Option Infer e Pagina di compilazione di Creazione progetti (Visual Basic).