Inferência de tipo local (Visual Basic)
O compilador do Visual Basic usa inferência de tipo para determinar os tipos de dados das variáveis locais declaradas sem uma cláusula As
. O compilador infere o tipo da variável com base no tipo da expressão de inicialização. Isso permite que você declare variáveis sem declarar explicitamente um tipo, conforme mostrado no exemplo a seguir. Como resultado das declarações, tanto num1
e num2
são fortemente definidos como tipo inteiro.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Observação
Se você não quiser que num2
no exemplo anterior receba um tipo como Integer
, especifique outro tipo usando uma declaração como Dim num3 As Object = 3
ou Dim num4 As Double = 3
.
Observação
A inferência de tipos pode ser usada apenas para variáveis locais não estáticas; não pode ser usada para determinar o tipo de campos de classe, propriedades ou funções.
A inferência de tipo de variável local se aplica no nível do procedimento. Ele não pode ser usado para declarar variáveis no nível do módulo (dentro de uma classe, estrutura, módulo ou interface, mas não dentro de um procedimento ou bloco). Se num2
no exemplo anterior fosse um campo de uma classe em vez de uma variável local em um procedimento, a declaração causaria um erro com Option Strict
e classificaria num2
como uma Object
com Option Strict
desativada. Da mesma forma, a inferência de tipos local não se aplica a variáveis de nível de procedimento declaradas como Static
.
Inferência de tipos versus associação tardia
O código que usa inferência de tipos se assemelha ao código que depende da associação tardia. No entanto, a inferência de tipos define fortemente o tipo da variável em vez de deixá-la como Object
. O compilador usa o inicializador de variável para determinar o tipo da variável no tempo de compilação para produzir o código associado antecipadamente. No exemplo anterior, num2
, como num1
, recebe o tipo de Integer
.
O comportamento de variáveis associadas precocemente difere do de variáveis com limite final, para as quais o tipo é conhecido apenas no tempo de execução. Conhecer o tipo antecipadamente permite que o compilador identifique problemas antes da execução, aloque memória com precisão e execute outras otimizações. A associação inicial também permite que o IDE (ambiente de desenvolvimento integrado) do Visual Basic forneça ajuda do IntelliSense sobre os membros do objeto. A associação antecipada também é preferencial para o desempenho. Isso ocorre porque todos os dados armazenados em uma variável com limite tardio devem ser encapsulados como o tipo Object
e acessar os membros do tipo no tempo de execução torna o programa mais lento.
Exemplos
A inferência de tipo ocorre quando uma variável local é declarada e inicializada sem uma cláusula As
. O compilador usa o tipo do valor inicial atribuído como o tipo da variável. Por exemplo, cada uma das seguintes linhas de código declara uma variável do tipo String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
O código a seguir demonstra duas maneiras equivalentes de criar uma matriz de inteiros.
' 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}
É conveniente usar a inferência de tipo para determinar o tipo de uma variável de controle de loop. No código a seguir, o compilador infere que number
é Integer
porque someNumbers2
do exemplo anterior é uma matriz de inteiros.
Dim total = 0
For Each number In someNumbers2
total += number
Next
A inferência de tipo local pode ser usada em instruções Using
para estabelecer o tipo do nome do recurso, como demonstrado no exemplo a seguir.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
O tipo de variável também pode ser inferido dos valores retornados das funções, como demonstrado no exemplo a seguir. Tanto pList1
e pList2
são matrizes de processos porque Process.GetProcesses
retorna uma matriz de processos.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Opção Inferir
Option Infer
permite especificar se a inferência de tipo local é permitida em um arquivo específico. Para habilitar ou bloquear a opção, digite uma das instruções a seguir no início do arquivo.
Option Infer On
Option Infer Off
Se você não especificar um valor para Option Infer
no seu código, o padrão do compilador será Option Infer On
.
Se o valor definido para Option Infer
em um arquivo entrar em conflito com o valor definido no IDE ou na linha de comando, o valor no arquivo possui precedência.
Para obter mais informações, consulte Instrução deferir opção e Compilar página, designer de projeto (Visual Basic).