Оператор 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

Необязательный параметр.Служит для обозначения разделяемого метода.Дополнительные сведения см. в разделе Разделяемые методы (Visual Basic).

accessmodifier

Необязательный параметр.Может принимать следующие значения:

Дополнительные сведения см. в разделе Уровни доступа в Visual Basic.

proceduremodifiers

Необязательный параметр.Может принимать следующие значения:

Shared

Необязательный параметр.См. раздел Shared.

Shadows

Необязательный параметр.См. раздел Shadows.

Async

Необязательный параметр.См. раздел Async.

name

Обязательное.Имя процедуры.Дополнительные сведения см. в разделе Имена объявленных типов (Visual Basic).Чтобы создать процедуру конструктора для класса, задайте в качестве имени процедуры Sub ключевое слово New.Дополнительные сведения см. в разделе Время существования: создание и уничтожение объектов (Visual Basic).

typeparamlist

Необязательный параметр.Список параметров типов для универсальной процедуры.См. раздел Список типов.

parameterlist

Необязательный параметр.Список имен локальных переменных, представляющих параметры этой процедуры.Дополнительные сведения см. в разделе Список параметров (Visual Basic).

Implements

Необязательный параметр.Указывает, что эта процедура реализует одну или несколько Sub процедур, каждая из которых определена в интерфейсе, реализованном классом или структурой, которая содержит эту процедуру.Дополнительные сведения см. в разделе Оператор Implements.

implementslist

Параметр обязателен, если указано ключевое слово Implements.Список реализуемых процедур Sub.

implementedprocedure [ , implementedprocedure ... ]

Каждая процедура implementedprocedure имеет следующий синтаксис и составляющие:

interface.definedname

ЧастьОписание
interface Обязательное.Имя интерфейса, реализуемого классом или структурой, где содержится данная процедура.
definedname Обязательное.Имя, под которым процедура определена в interface.

Handles

Необязательный параметр.Указывает, что эта процедура может обрабатывать одно или несколько конкретных событий.Дополнительные сведения см. в разделе Предложение Handles (Visual Basic).

eventlist

Параметр обязателен, если указано ключевое слово Handles.Список событий, которые обрабатывает данная процедура.

eventspecifier [ , eventspecifier ... ]

Каждый описатель события eventspecifier имеет следующий синтаксис и составляющие:

eventvariable.event

ЧастьОписание
eventvariable Обязательное.Объектная переменная, объявленная с типом данных класса или структуры, где создается событие.
event Обязательное.Имя события, которое обрабатывает данная процедура.

statements

Необязательный параметр.Блок операторов для выполнения в этой процедуре.

EndSub

Завершает определение данной процедуры.

Заметки

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

Указание подпрограммы

Можно определить процедуру Sub только на уровне модуля.Контекст объявления, sub процедуры, следовательно, должен быть классом, структурой, модуля или интерфейса и не может быть исходным файлом, пространством имен процедурой или блоком.Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию (Visual Basic).

Для процедур 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, однако это ключевое слово не рекомендуется для большинства польз.Дополнительные сведения см. в разделе Оператор Call (Visual Basic).

Visual Basic иногда меняет местами содержащиеся в коде арифметические выражения для повышения внутренней эффективности выполнения программы.По этой причине, если список аргументов включает выражения, которые вызывают другие процедуры следует предполагать, что эти выражения будет Вызываются в указанном порядке.

Подпрограммы Async

Async с помощью функции можно вызывать асинхронные функции без использования явных обратных вызовов или вручную разделить ваш код через несколько функций или лямбда-выражения.

Если пометить модификатором Async процедуру можно использовать оператор подождите в процедуре.Если элемент управления достигает выражение Await в процедуре, Async возвращения вызывающему объекту и хода выполнения работ в процедуре приостанавливается до тех пор, пока подожданная задача не завершится.Если задача завершена, выполнение может возобновить в процедуре.

ПримечаниеПримечание

Передать процедуре Async вызывающему объекту, если обнаружен сначала подожданный объект, который еще не завершен или завершение процедуры по достижении двух величин - нет Async из этих условий выполняется первым.

Можно также пометить модификатором Оператор Function (Visual Basic)Async.Функция Async может иметь тип возвращаемого значения Task<TResult> или Task.Пример далее в этом разделе показана функция Async, которая имеет возвращаемый тип Task<TResult>.

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

Процедура Async не может объявлять все параметры ByRef.

Дополнительные сведения о процедурах по Async см. в разделе Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic), Поток управления в асинхронных программах (C# и Visual Basic) и Асинхронные типы возвращаемых значений (C# и Visual Basic).

Пример

В следующем примере оператор 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

В следующем примере DelayAsyncAsyncFunction, который имеет тип возврата 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 должно быть указано с модификатором 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

См. также

Задачи

Практическое руководство. Использование универсального класса (Visual Basic)

Устранение неполадок в процедурах (Visual Basic)

Ссылки

Оператор Implements

Оператор Function (Visual Basic)

Список параметров (Visual Basic)

Оператор Dim (Visual Basic)

Оператор Call (Visual Basic)

Предложение Of (Visual Basic)

Основные понятия

Массивы параметров (Visual Basic)

Разделяемые методы (Visual Basic)