Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Объявляет имя, параметры и код, определяющие процедуру 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 OverridesNotOverridable 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
Exit Sub Инструкции Return вызывают немедленный Sub выход из процедуры. Любое количество Exit Sub и Return операторы могут отображаться в любом месте процедуры, и вы можете смешивать и Exit Sub смешивать Return инструкции.
Вызов вложенных процедур
Вы вызываете процедуру 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 процедуры в основном используются для обработчиков событий, где невозможно вернуть значение. Процедуру AsyncSub нельзя ожидать, и вызывающий AsyncSub объект процедуры не может перехватывать исключения, вызываемые процедурой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 используется AsyncFunction тип возвращаемого 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_ClickSub должна быть определена с модификатором AsyncAwait , так как она имеет выражение.
' 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