Вывод локального типа (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 как ObjectOption 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}

С помощью вывода типа можно определить тип переменной элемента управления циклом. В следующем коде компилятор определяет, что numberIntegersomeNumbers2 из предыдущего примера представляет собой массив целых чисел.

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).

См. также