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).

Vedi anche