Inferencia de tipo de variable local (Visual Basic)
El compilador de Visual Basic usa la inferencia de tipos para determinar los tipos de datos de las variables locales declaradas sin una cláusula As
. El compilador deduce el tipo de la variable del tipo de la expresión de inicialización. Esto permite declarar variables sin indicar explícitamente un tipo, como se muestra en el ejemplo siguiente. Como resultado de las declaraciones, num1
y num2
están fuertemente tipados como enteros.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Nota
Si no quiere que num2
en el ejemplo anterior esté fuertemente tipado como Integer
, puede especificar otro tipo mediante una declaración como Dim num3 As Object = 3
o Dim num4 As Double = 3
.
Nota
La inferencia de tipos solo se puede usar para variables locales no estáticas; no se puede usar para determinar el tipo de campos de clase, propiedades o funciones.
La inferencia de tipo de variable local se aplica en el nivel de procedimiento. No se puede usar para declarar variables en el nivel de módulo (dentro de una clase, estructura, módulo o interfaz, pero no dentro de un procedimiento o bloque). Si num2
en el ejemplo anterior fuera un campo de una clase en lugar de una variable local de un procedimiento, la declaración provocaría un error con Option Strict
activado y clasificaría num2
como Object
con Option Strict
desactivado. Del mismo modo, la inferencia de tipo de variable local no se aplica a las variables de nivel de procedimiento declaradas como Static
.
Inferencia de tipos frente a enlace tardío
El código que usa la inferencia de tipos se parece al código que se basa en el enlace tardío. Pero la inferencia de tipos tipa fuertemente la variable en lugar de dejarla como Object
. El compilador usa el inicializador de una variable para determinar el tipo de la variable en tiempo de compilación a fin de generar código enlazado anticipadamente. En el ejemplo anterior, num2
, como num1
, está tipado como Integer
.
El comportamiento de las variables enlazadas anticipadamente difiere del de las variables enlazadas tardíamente, en las que el tipo solo se conoce en tiempo de ejecución. Conocer el tipo anticipadamente permite al compilador identificar problemas antes de la ejecución, asignar memoria con precisión y realizar otras optimizaciones. El enlace anticipado también permite que el entorno de desarrollo integrado (IDE) de Visual Basic proporcione ayuda de IntelliSense sobre los miembros de un objeto. El enlace anticipado también se prefiere por motivos de rendimiento. Esto se debe a que todos los datos almacenados en una variable enlazada tardíamente se deben encapsular como tipo Object
, y el acceso a los miembros del tipo en tiempo de ejecución hace que el programa sea más lento.
Ejemplos
La inferencia de tipos se produce cuando se declara una variable local sin una cláusula As
y se inicializa. El compilador usa el tipo del valor inicial asignado como tipo de la variable. Por ejemplo, cada una de las siguientes líneas de código declara una variable de tipo String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
En el código siguiente se muestran dos formas equivalentes de crear una matriz de enteros.
' 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}
Es conveniente usar la inferencia de tipos para determinar el tipo de una variable de control de bucle. En el código siguiente, el compilador deduce que number
es Integer
porque someNumbers2
en el ejemplo anterior es una matriz de enteros.
Dim total = 0
For Each number In someNumbers2
total += number
Next
La inferencia de tipo de variable local se puede usar en instrucciones Using
para establecer el tipo del nombre del recurso, como se muestra en el ejemplo siguiente.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
El tipo de una variable también se puede deducir de los valores devueltos de funciones, como se muestra en el ejemplo siguiente. pList1
y pList2
son matrices de procesos porque Process.GetProcesses
devuelve una matriz de procesos.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Option Infer
Option Infer
permite especificar si la inferencia de tipo de variable local está permitida en un archivo determinado. Para habilitar o bloquear la opción, escriba una de las siguientes instrucciones al principio del archivo.
Option Infer On
Option Infer Off
Si no especifica un valor para Option Infer
en el código, el valor predeterminado del compilador es Option Infer On
.
Si el valor establecido para Option Infer
en un archivo entra en conflicto con el valor establecido en el IDE o en la línea de comandos, el valor del archivo tiene prioridad.
Para obtener más información, vea Option Infer (instrucción) y Página Compilación, Diseñador de proyectos (Visual Basic).