Оператор Sub (Visual Basic)
Объявляет имя, параметры и код, определяющие процедуру Sub
.
Синтаксис
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub
Детали
attributelist
Необязательно. См . список атрибутов.
Partial
Необязательно. Указывает определение частичного метода. См . частичные методы.
accessmodifier
Необязательно. Может применяться один из перечисленных ниже типов.
См. раздел Access levels in Visual Basic.
proceduremodifiers
Необязательно. Может применяться один из перечисленных ниже типов.
MustOverride Overrides
NotOverridable Overrides
Shared
Необязательно. См . раздел "Общий доступ".
Shadows
Необязательно. См . тени.
Async
Необязательно. См . async.
name
Обязательный. Имя процедуры. См. раздел Declared Element Names. Чтобы создать процедуру конструктора
Sub
для класса, задайте имя процедуры ключевому словуNew
. Дополнительные сведения см. в разделе "Время существования объекта": создание и уничтожение объектов.typeparamlist
Необязательно. Список параметров типа для универсальной процедуры. См . список типов.
parameterlist
Необязательно. Список имен локальных переменных, представляющих параметры этой процедуры. См . список параметров.
Implements
Необязательно. Указывает, что эта процедура реализует одну или несколько
Sub
процедур, каждый из которых определен в интерфейсе, реализуемом этой процедурой, содержащей класс или структуру. См . инструкцию "Реализация".implementslist
Является обязательным, если предоставлен параметр
Implements
. Список реализуемых процедурSub
.implementedprocedure [ , implementedprocedure ... ]
Каждый элемент
implementedprocedure
имеет перечисленные ниже синтаксис и компоненты.interface.definedname
Часть Description interface
Обязательное. Имя интерфейса, реализуемого этой процедурой, содержащей класс или структуру. definedname
Обязательный. Имя, под которым процедура определена в interface
.Handles
Необязательно. Указывает, что эта процедура может обрабатывать одно или несколько конкретных событий. См . дескрипторы.
eventlist
Является обязательным, если предоставлен параметр
Handles
. Список событий, которые обрабатывает эта процедура.eventspecifier [ , eventspecifier ... ]
Каждый элемент
eventspecifier
имеет перечисленные ниже синтаксис и компоненты.eventvariable.event
Часть Description eventvariable
Обязательное. Переменная объекта, объявленная с типом данных класса или структуры, которая вызывает событие. event
Обязательный. Имя события, которое обрабатывает эта процедура. statements
Необязательно. Блок инструкций, выполняемых в рамках этой процедуры.
End Sub
Завершает определение этой процедуры.
Замечания
Весь исполняемый код должен находиться внутри процедуры. Используйте процедуру Sub
, если вы не хотите возвращать значение вызывающей коду. Используйте процедуру Function
, когда вы хотите вернуть значение.
Определение вложенных процедур
Процедуру Sub
можно определить только на уровне модуля. Контекст объявления для вложенной процедуры должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Sub
процедуры по умолчанию для общедоступного доступа. Уровни доступа можно настроить с помощью модификаторов доступа.
Если процедура использует ключевое Implements
слово, содержащий класс или структура должны иметь Implements
оператор, который немедленно следует его Class
или Structure
оператору. Оператор Implements
должен включать каждый интерфейс, указанный в implementslist
. Однако имя, с помощью которого интерфейс определяет Sub
(в definedname
) не обязательно совпадает с именем этой процедуры (в name
).
Возврат из под процедуры
Sub
Когда процедура возвращается в вызывающий код, выполнение продолжается с оператором после оператора, вызвавого его.
В следующем примере показан возврат из Sub
процедуры.
Sub mySub(ByVal q As String)
Return
End Sub
Return
Инструкции Exit Sub
вызывают немедленный Sub
выход из процедуры. Любое количество Exit Sub
и Return
операторы могут отображаться в любом месте процедуры, и вы можете смешивать и Return
смешивать Exit Sub
инструкции.
Вызов вложенных процедур
Вы вызываете процедуру Sub
с помощью имени процедуры в инструкции, а затем после этого имени со списком аргументов в скобках. Вы можете опустить скобки только в том случае, если аргументы не указаны. Однако код является более читаемым, если всегда включать скобки.
Процедура Sub
и процедура могут иметь параметры и Function
выполнять ряд инструкций. Function
Однако процедура возвращает значение, и Sub
процедура не выполняется. Поэтому нельзя использовать процедуру Sub
в выражении.
Ключевое Call
слово можно использовать при вызове Sub
процедуры, но это ключевое слово не рекомендуется для большинства использования. Дополнительные сведения см. в инструкции вызова.
Visual Basic иногда изменяет арифметические выражения для повышения внутренней эффективности. По этой причине, если список аргументов содержит выражения, вызывающие другие процедуры, не следует предположить, что эти выражения будут вызываться в определенном порядке.
Асинхронные вложенные процедуры
С помощью функции Async можно вызывать асинхронные функции, не используя явные обратные вызовы или вручную разделяя код по нескольким функциям или лямбда-выражениям.
Если пометить процедуру модификатором Async , можно использовать оператор Await в процедуре. Когда элемент управления достигает Await
выражения в Async
процедуре, элемент управления возвращается вызывающему объекту, а ход выполнения процедуры приостанавливается до тех пор, пока ожидающая задача не завершится. По завершении задачи выполнение может возобновиться в процедуре.
Примечание.
Процедура Async
возвращается вызывающему объекту при обнаружении первого ожидающего объекта, который еще не завершен, или достигается конец Async
процедуры, в зависимости от того, что происходит сначала.
Можно также пометить оператор функции модификатором Async
. Функция Async
может иметь тип возвращаемого Task<TResult> значения или Task. Пример ниже в этом разделе показывает Async
функцию, которая имеет тип возвращаемого Task<TResult>значения.
Async
Sub
процедуры в основном используются для обработчиков событий, где невозможно вернуть значение. Процедуру Async
Sub
нельзя ожидать, и вызывающий Sub
Async
объект процедуры не может перехватывать исключения, вызываемые процедуройSub
.
Процедура Async
не может объявлять параметры ByRef .
Дополнительные сведения о процедурах см. в Async
статье асинхронное программирование с помощью Async и Await, потока управления в асинхронных программах и асинхронных типах возвращаемых значений.
Пример 1
В следующем примере оператор используется Sub
для определения имени, параметров и кода, которые образуют текст Sub
процедуры.
Sub ComputeArea(ByVal length As Double, ByVal width As Double)
' Declare local variable.
Dim area As Double
If length = 0 Or width = 0 Then
' If either argument = 0 then exit Sub immediately.
Exit Sub
End If
' Calculate area of rectangle.
area = length * width
' Print area to Immediate window.
Debug.WriteLine(area)
End Sub
Пример 2
В следующем примере DelayAsync
используется Async
Function
тип возвращаемого Task<TResult>значения. DelayAsync
имеет инструкцию Return
, которая возвращает целое число. Таким образом, объявление DelayAsync
функции должно иметь возвращаемый тип Task(Of Integer)
. Так как возвращаемый тип являетсяTask(Of Integer)
, оценка Await
выражения в DoSomethingAsync
создает целое число, как показано в следующей инструкции. Dim result As Integer = Await delayTask
Процедура startButton_Click
является примером Async Sub
процедуры. Так как DoSomethingAsync
это Async
функция, задача вызова DoSomethingAsync
должна ожидаться, как показано в следующем операторе: Await DoSomethingAsync()
Процедура startButton_Click
Sub
должна быть определена с модификатором Async
Await
, так как она имеет выражение.
' Imports System.Diagnostics
' Imports System.Threading.Tasks
' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Await DoSomethingAsync()
End Sub
Private Async Function DoSomethingAsync() As Task
Dim delayTask As Task(Of Integer) = DelayAsync()
Dim result As Integer = Await delayTask
' The previous two statements may be combined into
' the following statement.
' Dim result As Integer = Await DelayAsync()
Debug.WriteLine("Result: " & result)
End Function
Private Async Function DelayAsync() As Task(Of Integer)
Await Task.Delay(100)
Return 5
End Function
' Output:
' Result: 5