Оператор Sub (Visual Basic)Sub Statement (Visual Basic)

Объявляет имя, параметры и код, определяющие процедуру Sub.Declares the name, parameters, and code that define a Sub procedure.

СинтаксисSyntax

[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Sub ]
    [ statements ]
End Sub

ЧастиParts

  • attributelist

    Необязательный элемент.Optional. См. список атрибутов.See Attribute List.

  • Partial

    Необязательный элемент.Optional. Указывает определение разделяемого метода.Indicates definition of a partial method. См. раздел разделяемые методы.See Partial Methods.

  • accessmodifier

    Необязательный элемент.Optional. Ниже указаны доступные значения.Can be one of the following:

    См. раздел Access levels in Visual Basic.See Access levels in Visual Basic.

  • proceduremodifiers

    Необязательный элемент.Optional. Ниже указаны доступные значения.Can be one of the following:

  • Shared

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

  • Shadows

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

  • Async

    Необязательный элемент.Optional. См. статью Async.See Async.

  • name

    Обязательно.Required. Имя процедуры.Name of the procedure. См. раздел Declared Element Names.See Declared Element Names. Чтобы создать процедуру конструктора для класса, задайте в качестве имени Sub процедуры ключевое слово New.To create a constructor procedure for a class, set the name of a Sub procedure to the New keyword. Дополнительные сведения см. в разделе время существования объекта: как создаются и уничтожаются объекты.For more information, see Object Lifetime: How Objects Are Created and Destroyed.

  • typeparamlist

    Необязательный элемент.Optional. Список параметров типа для универсальной процедуры.List of type parameters for a generic procedure. См. список типов.See Type List.

  • parameterlist

    Необязательный элемент.Optional. Список имен локальных переменных, представляющих параметры этой процедуры.List of local variable names representing the parameters of this procedure. См. список параметров.See Parameter List.

  • Implements

    Необязательный элемент.Optional. Указывает, что эта процедура реализует одну или несколько Sub процедур, каждая из которых определена в интерфейсе, реализуемом классом или структурой этой процедуры.Indicates that this procedure implements one or more Sub procedures, each one defined in an interface implemented by this procedure's containing class or structure. См. инструкцию Implements.See Implements Statement.

  • implementslist

    Является обязательным, если предоставлен параметр Implements.Required if Implements is supplied. Список реализуемых процедур Sub.List of Sub procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.Each implementedprocedure has the following syntax and parts:

    interface.definedname

    ОтделениеPart ОписаниеDescription
    interface Обязательно.Required. Имя интерфейса, реализованного классом или структурой, содержащейся в этой процедуре.Name of an interface implemented by this procedure's containing class or structure.
    definedname Обязательно.Required. Имя, под которым процедура определена в interface.Name by which the procedure is defined in interface.
  • Handles

    Необязательный элемент.Optional. Указывает, что эта процедура может управлять одним или несколькими конкретными событиями.Indicates that this procedure can handle one or more specific events. См. раздел Handles.See Handles.

  • eventlist

    Является обязательным, если предоставлен параметр Handles.Required if Handles is supplied. Список событий, обрабатываемых этой процедурой.List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.Each eventspecifier has the following syntax and parts:

    eventvariable.event

    ОтделениеPart ОписаниеDescription
    eventvariable Обязательно.Required. Объектная переменная, объявленная с типом данных класса или структуры, которая вызывает событие.Object variable declared with the data type of the class or structure that raises the event.
    event Обязательно.Required. Имя события, обрабатываемого этой процедурой.Name of the event this procedure handles.
  • statements

    Необязательный элемент.Optional. Блок инструкций для выполнения в рамках этой процедуры.Block of statements to run within this procedure.

  • End Sub

    Завершает определение этой процедуры.Terminates the definition of this procedure.

ПримечанияRemarks

Весь исполняемый код должен находиться внутри процедуры.All executable code must be inside a procedure. Если вы не хотите возвращать значение в вызывающий код, используйте процедуру Sub.Use a Sub procedure when you don't want to return a value to the calling code. Используйте Function процедуру, если требуется вернуть значение.Use a Function procedure when you want to return a value.

Определение подпроцедурыDefining a Sub Procedure

Процедуру Sub можно определить только на уровне модуля.You can define a Sub procedure only at the module level. Контекст объявления для процедуры, следовательно, должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком.The declaration context for a sub procedure must, therefore, be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.For more information, see Declaration Contexts and Default Access Levels.

Sub процедуры по умолчанию имеют общий доступ.Sub procedures default to public access. Уровни доступа можно изменить с помощью модификаторов доступа.You can adjust their access levels by using the access modifiers.

Если процедура использует ключевое слово Implements, содержащий класс или структуру должны содержать инструкцию Implements, которая сразу же следует за инструкцией Class или Structure.If the procedure uses the Implements keyword, the containing class or structure must have an Implements statement that immediately follows its Class or Structure statement. Оператор Implements должен содержать каждый интерфейс, указанный в implementslist.The Implements statement must include each interface that's specified in implementslist. Однако имя, по которому интерфейс определяет Subdefinedname), не обязательно должен совпадать с именем этой процедуры (в name).However, the name by which an interface defines the Sub (in definedname) doesn't have to match the name of this procedure (in name).

Возврат из подпроцедурыReturning from a Sub Procedure

Когда Sub процедура возвращается в вызывающий код, выполнение переходит к инструкции после оператора, вызвавшего ее.When a Sub procedure returns to the calling code, execution continues with the statement after the statement that called it.

В следующем примере показан возврат из процедуры Sub.The following example shows a return from a Sub procedure.

Sub mySub(ByVal q As String)
    Return
End Sub

Операторы Exit Sub и Return вызывают немедленный выход из процедуры Sub.The Exit Sub and Return statements cause an immediate exit from a Sub procedure. Любое число инструкций Exit Sub и Return может использоваться в любом месте процедуры, и можно смешивать Exit Sub и Return операторы.Any number of Exit Sub and Return statements can appear anywhere in the procedure, and you can mix Exit Sub and Return statements.

Вызов процедуры подпрограммыCalling a Sub Procedure

Процедура Sub вызывается с помощью имени процедуры в инструкции и затем после этого имени вместе со списком аргументов в круглых скобках.You call a Sub procedure by using the procedure name in a statement and then following that name with its argument list in parentheses. Скобки можно опустить, только если не указаны аргументы.You can omit the parentheses only if you don't supply any arguments. Однако код является более удобочитаемым, если всегда включать круглые скобки.However, your code is more readable if you always include the parentheses.

Процедура Sub и процедура Function могут иметь параметры и выполнять ряд инструкций.A Sub procedure and a Function procedure can have parameters and perform a series of statements. Однако процедура Function возвращает значение, а Sub процедура — нет.However, a Function procedure returns a value, and a Sub procedure doesn't. Поэтому в выражении нельзя использовать Sub процедуру.Therefore, you can't use a Sub procedure in an expression.

При вызове Sub процедуры можно использовать ключевое слово Call, но это ключевое слово не рекомендуется для большинства случаев использования.You can use the Call keyword when you call a Sub procedure, but that keyword isn't recommended for most uses. Дополнительные сведения см. в разделе оператор Call.For more information, see Call Statement.

Visual Basic иногда переупорядочивает арифметические выражения для повышения внутренней эффективности.Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. По этой причине, если список аргументов содержит выражения, вызывающие другие процедуры, не следует рассчитывать на то, что эти выражения будут вызываться в определенном порядке.For that reason, if your argument list includes expressions that call other procedures, you shouldn't assume that those expressions will be called in a particular order.

Процедуры AsyncAsync Sub Procedures

С помощью функции Async можно вызывать асинхронные функции без использования явных обратных вызовов или вручную разделить код по нескольким функциям или лямбда-выражениям.By using the Async feature, you can invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

Если вы пометите процедуру с модификатором Async , то можете использовать оператор await в процедуре.If you mark a procedure with the Async modifier, you can use the Await operator in the procedure. Когда управление достигает Await выражения в Async процедуре, управление возвращается вызывающему объекту, и ход выполнения процедуры приостанавливается до тех пор, пока не завершится ожидаемая задача.When control reaches an Await expression in the Async procedure, control returns to the caller, and progress in the procedure is suspended until the awaited task completes. После завершения задачи выполнение может быть возобновлено в процедуре.When the task is complete, execution can resume in the procedure.

Примечание

Async процедура возвращается к вызывающему объекту, когда происходит либо первый ожидающий объект, который еще не завершен, либо достигнут конец процедуры Async, в зависимости от того, какое событие произойдет раньше.An Async procedure returns to the caller when either the first awaited object that’s not yet complete is encountered or the end of the Async procedure is reached, whichever occurs first.

Можно также пометить оператор Function с помощью модификатора Async.You can also mark a Function Statement with the Async modifier. Функция Async может иметь тип возвращаемого значения Task<TResult> или Task.An Async function can have a return type of Task<TResult> or Task. В примере далее в этом разделе показана функция Async с типом возвращаемого значения Task<TResult>.An example later in this topic shows an Async function that has a return type of Task<TResult>.

Async процедуры Sub в основном используются для обработчиков событий, где значение не может быть возвращено.Async Sub procedures are primarily used for event handlers, where a value can't be returned. Процедуру Async Sub не может быть ожидаемой, и вызывающая процедура Async Sub не может перехватывать исключения, вызываемые процедурой Sub.An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that the Sub procedure throws.

Процедура Async не может объявлять параметры ByRef .An Async procedure can't declare any ByRef parameters.

Дополнительные сведения о Async процедурах см. в разделе Асинхронное программирование с использованием Async и await, поток управления в асинхронных программахи асинхронные типы возвращаемыхданных.For more information about Async procedures, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

ПримерExample

В следующем примере оператор Sub используется для определения имени, параметров и кода, образующих тело процедуры Sub.The following example uses the Sub statement to define the name, parameters, and code that form the body of a Sub procedure.

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

ПримерExample

В следующем примере DelayAsync является Async Function с типом возвращаемого значения Task<TResult>.In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync имеет инструкцию Return , которая возвращает целое число.DelayAsync has a Return statement that returns an integer. Поэтому объявление функции DelayAsync должно иметь тип возвращаемого значения Task(Of Integer).Therefore, the function declaration of DelayAsync must have a return type of Task(Of Integer). Поскольку тип возвращаемого значения — Task(Of Integer), вычисление выражения Await в DoSomethingAsync создает целое число, как показано в следующей инструкции: Dim result As Integer = Await delayTask.Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer, as the following statement shows: Dim result As Integer = Await delayTask.

startButton_Click процедура является примером процедуры Async Sub.The startButton_Click procedure is an example of an Async Sub procedure. Поскольку DoSomethingAsync является функцией Async, необходимо ожидать, что задача для вызова DoSomethingAsync должна быть ожидаемой, как показано в следующей инструкции: Await DoSomethingAsync().Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement shows: Await DoSomethingAsync(). Процедура startButton_Click Sub должна быть определена с помощью модификатора Async, так как она содержит выражение Await.The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' 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

См. такжеSee also