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

    Необязательно. Может применяться один из перечисленных ниже типов.

  • 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. Однако имя, с помощью которого интерфейс определяет Subdefinedname) не обязательно совпадает с именем этой процедуры (в 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 в выражении.

При вызове Sub процедуры можно использовать Call ключевое слово, но это ключевое слово не рекомендуется для большинства использования. Дополнительные сведения см. в инструкции вызова.

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

Асинхронные вложенные процедуры

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

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

Примечание.

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

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

AsyncSub процедуры в основном используются для обработчиков событий, где невозможно вернуть значение. Процедуру AsyncSub нельзя ожидать, и вызывающийSubAsyncобъект процедуры не может перехватывать исключения, вызываемые процедурой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

См. также