Condividi tramite


Inferenza del tipo locale (Visual Basic)

Il compilatore Visual Basic usa l'inferenza del tipo per determinare i tipi di dati delle variabili locali dichiarate senza una As clausola . Il compilatore deduce il tipo della variabile dal 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 interi.

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub

Annotazioni

Se non si vuole che num2 nell'esempio precedente sia digitato come un Integer, è possibile specificare un altro tipo usando una dichiarazione come Dim num3 As Object = 3 o Dim num4 As Double = 3.

Annotazioni

L'inferenza del tipo può essere usata solo per variabili locali non statiche; non può essere usato per determinare il tipo di campi di classe, proprietà o funzioni.

L'inferenza del tipo locale viene applicata a livello di procedura. Non può essere usato 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 invece di una variabile locale in una routine, la dichiarazione provocherebbe un errore quando Option Strict è attivato e num2 verrebbe classificato come Object quando Option Strict è disattivato. Analogamente, l'inferenza del tipo 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 di tipizzazione assegna un tipo forte alla variabile anziché lasciarla come Object. Il compilatore usa l'inizializzatore di una variabile per determinare il tipo della variabile in fase di compilazione per produrre codice con associazione anticipata. Nell'esempio precedente, num2, come num1, viene digitato come un Integer.

Il comportamento delle variabili con associazione anticipata differisce da quello delle variabili ad associazione tardiva, per 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. Il legame anticipato è preferibile anche per le prestazioni. Ciò è dovuto al fatto che tutti i dati archiviati in una variabile con associazione tardiva devono essere inclusi nel wrapping come tipo Objecte l'accesso ai membri del tipo in fase di esecuzione rende il programma più lento.

Esempi

L'inferenza del tipo si verifica quando una variabile locale viene dichiarata senza una As clausola 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 numeri 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 è un Integer perché someNumbers2 nell'esempio precedente è una matrice di numeri interi.

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

L'inferenza del tipo locale può essere utilizzata nelle istruzioni Using per determinare il tipo del nome della risorsa, come dimostra il seguente esempio.

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 locale è consentita in un determinato 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.

Se il valore impostato per Option Infer in un file è in conflitto con il valore impostato nell'IDE o nella riga di comando, il valore nel file ha la precedenza.

Per altre informazioni, vedere Option Infer Statement e Compile Page, Project Designer (Visual Basic).

Vedere anche