Share via


Instrução Sub (Visual Basic)

Declara o nome, parâmetros e código que definem um procedimento Sub.

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

Partes

Termo

Definição

attributelist

Opcional. Veja Lista de Atributos.

Partial

Opcional. indica a definição de um método parcial. Consulte Métodos parciais (Visual Basic).

accessmodifier

Opcional. Pode ser um dos seguintes:

Veja Níveis de acesso no Visual Basic.

proceduremodifiers

Opcional. Pode ser um dos seguintes:

Shared

Opcional. Consulte Compartilhada.

Shadows

Opcional. Veja Shadows.

Async

Opcional. Consulte Async.

name

Obrigatório. Nome do procedimento. Consulte Nomes de elemento declarados (Visual Basic). Para criar um procedimento de construtor para uma classe, defina o nome de um procedimento de Sub a palavra-chave de New . Para obter mais informações, consulte Tempo de vida do objeto: como os objetos são criados e destruídos (Visual Basic).

typeparamlist

Opcional. Lista de parâmetros de tipo para um procedimento genérico. Consulte Type List.

parameterlist

Opcional. Lista de nomes variável local que representam os parâmetros deste procedimento. Consulte Lista de parâmetros (Visual Basic).

Implements

Opcional. Indica que essa propriedade implementa uma ou mais procedimentos Sub, cada uma delas definida em uma interface implementada por essa classe ou estrutura contendo o procedimento. Consulte Instrução Implements.

implementslist

Necessário se Implements é fornecido. Lista de procedimentos Sub que serão implementados

implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure possui a seguinte sintaxe e partes:

interface.definedname

Parte

Descrição

interface

Obrigatório. Nome de uma interface implementada por essa classe ou estrutura contendo o procedimento.

definedname

Obrigatório. Nome pelo qual o procedimento é definido em interface.

Handles

Opcional. Indica que esse procedimento pode manipular um ou mais eventos específicos. Consulte Cláusula Handles (Visual Basic).

eventlist

Necessário se Handles é fornecido. Lista de eventos que esse procedimento manipula.

eventspecifier [ , eventspecifier ... ]

Cada eventspecifier possui a seguinte sintaxe e partes:

eventvariable.event

Parte

Descrição

eventvariable

Obrigatório. Variável de objeto declarada com o tipo de dados da classe ou estrutura que gera o evento.

event

Obrigatório. Nome do evento que esse procedimento manipula.

statements

Opcional. Bloco de instruções para ser executado dentro de este procedimento.

End Sub

Finaliza a definição desse procedimento.

Comentários

Todos os códigos executáveis deverão estar dentro de um procedimento. Use um procedimento de Sub quando você não quiser retornar um valor para o código de chamada. Use um procedimento de Function quando você deseja retornar um valor.

Definindo um procedimento sub

Você pode definir um procedimento de Sub somente em nível de módulo. O contexto da declaração para um procedimento sub, portanto, deve ser uma classe, estrutura, módulo, ou interface e não pode ser um arquivo fonte, namespace, procedimento, ou bloco. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão (Visual Basic).

Procedimentos Sub têm acesso público como padrão. Você pode ajustar os níveis de acesso com os modificadores de acesso.

Se o procedimento usa a palavra-chave de Implements , a classe ou estrutura contenedora devem ter uma instrução de Implements que segue a declaração imediatamente de Class ou de Structure . A declaração de Implements deve incluir cada interface que é especificada em implementslist. Em o entanto, o nome pelo qual uma interface define Subdefinedname(em) não precisa coincidir com o nome do procedimento (em name).

Retornando a partir de um procedimento sub

Quando o procedimento retorna de Sub o código de chamada, continuarão execução com a declaração após a declaração que a chamou.

O exemplo a seguir mostra um retorno de um procedimento de Sub .

Sub mySub(ByVal q As String)
    Return
End Sub 

O Exit Sub e instruções Return causam saída imediata de um procedimento Sub. Qualquer número de declarações Exit Sub e Return pode aparecer em qualquer lugar no procedimento, e você pode misturar declarações Exit Sub e Return.

Chamando um procedimento sub

Você chama um procedimento de Sub usando o nome do procedimento em uma instrução e então depois de esse nome com a lista de argumentos entre parênteses. Você pode omitir os parênteses somente se você não fornecer quaisquer argumentos. No entanto, seu código é mais legível se você sempre incluir os parênteses.

um procedimento de Sub e um procedimento de Function podem ter parâmetros e executar uma série de instruções. Em o entanto, o procedimento retorna um valor de Function , e um procedimento de Sub não. Portanto, você não pode usar um procedimento de Sub em uma expressão.

Você pode usar a palavra-chave de Call quando você chama um procedimento de Sub , mas esse palavra-chave não é recomendado para a maioria dos usos. Para obter mais informações, consulte Instrução Call (Visual Basic).

Visual Basic, às vezes, reorganiza expressões aritméticas para aumentar a eficiência interna. Por esse motivo, se sua lista de argumentos inclui as expressões que chamam outros procedimentos, você não deve presumir que serão chamados essas expressões em uma ordem específica.

Procedimentos da sub-rotina de Async

Usando o recurso de Async, você pode chamar funções assíncronas sem usar retornos de chamada explícita ou manualmente dividir seu código em várias funções ou expressões lambda.

Se você marcar um procedimento com o modificador de Async , você pode usar o operador de espere no procedimento. Quando o controle atingir uma expressão de Await no procedimento de Async , o controle retorna para o chamador, e o estado no procedimento é suspenso até que a tarefa deve terminar. Quando a tarefa estiver concluída, a execução pode continuar no procedimento.

Dica

Um procedimento retorna para o chamador de Async quando qualquer pessoa que o objeto primeiro esperado que ainda não está completo é encontrado ou o final do procedimento de Async é alcançado, qualquer surge principalmente.

Você também pode marcar Instrução Function (Visual Basic) com o modificador de Async . uma função de Async pode ter um tipo de retorno de Task ou de Task. Um exemplo mais adiante em este tópico mostra uma função de Async que tenha um tipo de retorno de Task.

os procedimentos deAsyncSub são usados principalmente para os manipuladores de eventos, onde um valor pode não ser retornado. Um procedimento de AsyncSub não pode ser esperado, e o chamador de um procedimento de AsyncSub não pode capturar exceções que o gera do procedimento de Sub .

Um procedimento de Async não pode declarar nenhum parâmetro de ByRef .

Para obter mais informações sobre procedimentos de Async , consulte Programação assíncrona com Async e Await (C# e Visual Basic), Fluxo de controle em programas assíncronos (C# e Visual Basic), e Tipos de retorno assíncronos (C# e Visual Basic).

Exemplo

O exemplo a seguir utiliza a instrução de Sub para definir o nome, parâmetros, e o código que formam o corpo de um procedimento de 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

Em o exemplo, DelayAsync é AsyncFunction que tem um tipo de retorno de Task. DelayAsync tem uma instrução de Return que retorna um número inteiro. Portanto, a declaração da função de DelayAsync deve ter um tipo de retorno de Task(Of Integer). Porque o tipo de retorno é Task(Of Integer), a avaliação da expressão de Await em DoSomethingAsync gera um inteiro, porque a instrução a seguir mostra: Dim result As Integer = Await delayTask.

o procedimento de startButton_Click é um exemplo de um procedimento de Async Sub . Porque DoSomethingAsync é uma função de Async , a tarefa para a chamada a DoSomethingAsync deve ser esperada, porque a instrução a seguir mostra: Await DoSomethingAsync(). o procedimento de startButton_ClickSub deve ser definido com o modificador de Async porque tem uma expressão de 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

Consulte também

Tarefas

Como usar uma classe genérica (Visual Basic)

Solucionando problemas de procedimentos (Visual Basic)

Referência

Instrução Implements

Instrução Function (Visual Basic)

Lista de parâmetros (Visual Basic)

Instrução Dim (Visual Basic)

Instrução Call (Visual Basic)

Cláusula Of (Visual Basic)

Conceitos

Matrizes de parâmetros (Visual Basic)

Métodos parciais (Visual Basic)