Inferência de tipo local (Visual Basic)
O compilador do Visual Basic usa inferência de tipo para determinar os tipos de dados de variáveis locais declaradas sem uma As
cláusula. O compilador infere o tipo da variável a partir do 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, ambos num1
e num2
são fortemente digitados como inteiros.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Nota
Se você não quiser num2
que no exemplo anterior seja digitado como um Integer
, você pode especificar outro tipo usando uma declaração como Dim num3 As Object = 3
ou Dim num4 As Double = 3
.
Nota
A inferência de tipo só pode ser usada para variáveis locais não estáticas; ele não pode ser usado para determinar o tipo de campos de classe, propriedades ou funções.
A inferência de tipo local aplica-se ao 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
on e classificaria num2
como um Object
com Option Strict
off. Da mesma forma, a inferência de tipo local não se aplica às variáveis de nível de procedimento declaradas como Static
.
Inferência de tipo vs. vinculação tardia
O código que usa inferência de tipo se assemelha ao código que depende de vinculação tardia. No entanto, a inferência de tipo digita fortemente a variável em vez de deixá-la como Object
. O compilador usa o inicializador de uma variável para determinar o tipo da variável em tempo de compilação para produzir código de ligação antecipada. No exemplo anterior, num2
, como num1
, é digitado como um Integer
arquivo .
O comportamento das variáveis de ligação inicial difere do comportamento das variáveis de ligação tardia, para as quais o tipo é conhecido apenas em 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 antecipada também permite que o ambiente de desenvolvimento integrado (IDE) do Visual Basic forneça Ajuda do IntelliSense sobre os membros de um objeto. A vinculação antecipada também é preferida para o desempenho. Isso ocorre porque todos os dados armazenados em uma variável de ligação tardia devem ser encapsulados como tipo Object
, e acessar membros do tipo em tempo de execução torna o programa mais lento.
Exemplos
A inferência de tipo ocorre quando uma variável local é declarada sem uma As
cláusula e inicializada. 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
é um 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 Using
instruções para estabelecer o tipo do nome do recurso, como demonstra o exemplo a seguir.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
O tipo de uma variável também pode ser inferido a partir dos valores de retorno de funções, como demonstra o exemplo a seguir. Ambos 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 Infer
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
em seu código, o padrão do compilador será Option Infer On
.
Se o valor definido em Option Infer
um arquivo entrar em conflito com o valor definido no IDE ou na linha de comando, o valor no arquivo terá precedência.
Para obter mais informações, consulte Option Infer Statement and Compile Page, Project Designer (Visual Basic).