Вывод локального типа (Visual Basic)
Компилятор Visual Basic использует вывод типа для определения типов локальных переменных, объявленных без As
предложения. Компилятор определяет тип переменной из типа выражения инициализации. Это позволяет объявлять переменные без явного указания типа, как показано в следующем примере. В результате объявлений num1
оба и num2
строго типизированы как целые числа.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Примечание.
Если вы не хотите num2
вводить в предыдущем примере как тип Integer
, можно указать другой тип с помощью объявления, например Dim num3 As Object = 3
или Dim num4 As Double = 3
.
Примечание.
Вывод типов можно использовать только для нестатических локальных переменных; его нельзя использовать для определения типа полей класса, свойств или функций.
Определение локального типа применяется на уровне процедуры. Нельзя использовать для объявления переменных на уровне модуля (в пределах класса, структуры, модуля или интерфейса, но не в рамках процедуры или блока). Если num2
в предыдущем примере было поле класса вместо локальной переменной в процедуре, объявление приведет к ошибке включено Option Strict
и классифицирует num2
как Object
Option Strict
отключено. Аналогичным образом вывод локального типа не применяется к переменным уровня процедуры, объявленным как Static
.
Вывод типов и поздняя привязка
Код, использующий вывод типов, напоминает код, основанный на поздней привязке. Однако вывод типов строго типит переменную вместо того, чтобы оставить ее как Object
. Компилятор использует инициализатор переменной для определения типа переменной во время компиляции для создания кода с ранней привязкой. В предыдущем примере, напримерnum1
, num2
типизированный как .Integer
Поведение переменных с ранней привязкой отличается от поведения переменных с поздней привязкой, для которых тип известен только во время выполнения. Знание типа рано позволяет компилятору выявлять проблемы перед выполнением, выделять память точно и выполнять другие оптимизации. Ранняя привязка также позволяет интегрированной среде разработки Visual Basic (IDE) предоставлять справку IntelliSense о членах объекта. Ранняя привязка также предпочтительна для производительности. Это связано с тем, что все данные, хранящиеся в переменной с поздней привязкой, должны быть упакованы в виде типа Object
, а доступ к членам типа во время выполнения делает программу медленнее.
Примеры
Вывод типа возникает при объявлении локальной переменной As
без предложения и инициализации. Компилятор использует тип назначенного начального значения в качестве типа переменной. Например, каждая из следующих строк кода объявляет переменную типа String
.
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
Следующий код демонстрирует два эквивалентных способа создания массива целых чисел.
' 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}
С помощью вывода типа можно определить тип переменной элемента управления циклом. В следующем коде компилятор определяет, что number
Integer
someNumbers2
из предыдущего примера представляет собой массив целых чисел.
Dim total = 0
For Each number In someNumbers2
total += number
Next
Вывод локального типа можно использовать в Using
инструкциях для установления типа имени ресурса, как показано в следующем примере.
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
Тип переменной также можно вывести из возвращаемых значений функций, как показано в следующем примере. pList2
Оба pList1
и являются массивами процессов, так как Process.GetProcesses
возвращает массив процессов.
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Option Infer
Option Infer
позволяет указать, разрешено ли вывод локального типа в определенном файле. Чтобы включить или заблокировать параметр, введите одну из следующих инструкций в начале файла.
Option Infer On
Option Infer Off
Если значение в коде Option Infer
не указано, компилятор по умолчанию Option Infer On
.
Если значение, заданное для Option Infer
в файле, конфликтует со значением, заданным в среде разработки или в командной строке, приоритет имеет значение в файле.
Дополнительные сведения см. в разделе "Оператор вывода" и "Страница компиляции" в конструкторе проектов (Visual Basic).