Condividi tramite


Inferenza del tipo di variabile locale (Visual Basic)

Il compilatore in Visual Basic utilizza un'inferenza dei tipi per determinare i tipi di dati delle variabili locali dichiarate senza una clausola As. Tramite l'inferenza, il compilatore deduce il tipo della variabile dal tipo dell'espressione di inizializzazione Questo consente di dichiarare le variabili senza dichiarare in modo esplicito un tipo, come illustrato nell'esempio seguente. Come conseguenza delle dichiarazioni, num1 e 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 un Integer, è possibile specificare un altro tipo utilizzando una dichiarazione come Dim num3 As Object = 3 o Dim num4 As Double = 3.

L'inferenza del tipo di variabile locale si applica a livello di routine. Non può essere utilizzata 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 Option Strict on e classificherebbe num2 come Object con Option Strict off. In modo analogo, l'inferenza del tipo di variabile locale non è applicabile alle variabili a livello di routine dichiarate come Static.

Inferenza del tipo eassociazione tardiva

Il codice che utilizza l'inferenza dei tipi è simile al codice basato sull'associazione tardiva. Tuttavia, l'inferenza dei tipi digita può tipizzare fortemente la variabile anziché lasciarla come Object. Il compilatore utilizza l'inizializzatore della variabile per determinare in fase di compilazione il tipo di variabile per produrre codice con associazione anticipata. Nell'esempio precedente num2, come num1, è tipizzato come Integer.

Il comportamento delle variabili con associazione anticipata differisce da quello delle variabili con associazione tardiva per le quali il tipo è noto solo in fase di esecuzione . Conoscere il tipo in anticipo consente al compilatore di identificare i problemi prima dell'esecuzione, di allocare la memoria con precisione e di eseguire altre ottimizzazioni. L'associazione anticipata consente anche all'ambiente di sviluppo integrato (IDE) di Visual Basic di fornire la guida di IntelliSense per i membri di un oggetto. L'associazione anticipata è preferibile anche in termini di prestazioni. Perché su tutti i dati archiviati in una variabile ad associazione tardiva deve essere eseguito il wrapping come tipi Objecte l'accesso in fase di esecuzione ai membri del tipo rende più lento il programma.

Esempi

L'inferenza del tipo si verifica quando una variabile locale viene dichiarata senza una clausola As e inizializzata. Il compilatore utilizza il tipo del valore iniziale assegnato come tipo della variabile. Ognuna delle righe di codice seguenti dichiara ad esempio una variabile di tipo String.

' Using explicit typing. 
Dim name1 As String = "Springfield" 

' Using local type inference. 
Dim name2 = "Springfield"

Nel codice seguente vengono illustrate due modalità equivalenti per creare una matrice di Integer.

' 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}

È possibile utilizzare l'inferenza del tipo per determinare il tipo di una variabile di controllo del ciclo. Nel codice seguente il compilatore deduce che number è un Integer, perché someNumbers2 nell'esempio precedente è una matrice di Integer.

Dim total = 0
For Each number In someNumbers2
    total += number
Next

L'inferenza dei tipi locali può essere utilizzata nelle istruzioni Using per definire 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 da 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 particolare file. 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. Per i progetti aggiornati da Visual Basic 2008 o versioni precedenti, il valore predefinito del compilatore è Option Infer Off.

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 ulteriori informazioni, vedere Option Infer (istruzione) e Pagina Compilazione, Progettazione progetti (Visual Basic).

Restrizioni

L'inferenza dei tipi può essere utilizzata solo per variabili locali non statiche; non può essere utilizzata per determinare tipo di campi, proprietà, o funzioni di classi.

Vedere anche

Riferimenti

Istruzione For Each...Next (Visual Basic)

Istruzione For...Next (Visual Basic)

Option Infer (istruzione)

/optioninfer

Concetti

Tipi anonimi (Visual Basic)

Associazione anticipata e tardiva (Visual Basic)

Introduzione a LINQ in Visual Basic