Subinstrução (Visual Basic)

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

Sintaxe

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

Partes

  • attributelist

    Opcional. Consulte Lista de Atributos.

  • Partial

    Opcional. Indica a definição de um método parcial. Consulte Métodos parciais.

  • accessmodifier

    Opcional. Pode ser um dos seguintes:

    Consulte Níveis de acesso no Visual Basic.

  • proceduremodifiers

    Opcional. Pode ser um dos seguintes:

  • Shared

    Opcional. Ver Partilhado.

  • Shadows

    Opcional. Veja Sombras.

  • Async

    Opcional. Consulte Async.

  • name

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

  • typeparamlist

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

  • parameterlist

    Opcional. Lista de nomes de variáveis locais que representam os parâmetros deste procedimento. Consulte Lista de parâmetros.

  • Implements

    Opcional. Indica que este procedimento implementa um ou mais Sub procedimentos, cada um definido em uma interface implementada pela classe ou estrutura que contém este procedimento. Consulte Declaração de implementos.

  • implementslist

    Necessário se Implements for fornecido. Lista dos Sub procedimentos em curso.

    implementedprocedure [ , implementedprocedure ... ]

    Cada implementedprocedure um tem a seguinte sintaxe e partes:

    interface.definedname

    Parte Description
    interface Obrigatório. Nome de uma interface implementada por este procedimento contendo classe ou estrutura.
    definedname Obrigatório. Nome pelo qual o procedimento é definido em interface.
  • Handles

    Opcional. Indica que este procedimento pode manipular um ou mais eventos específicos. Consulte Alças.

  • eventlist

    Necessário se Handles for fornecido. Lista de eventos tratados por este procedimento.

    eventspecifier [ , eventspecifier ... ]

    Cada eventspecifier um tem a seguinte sintaxe e partes:

    eventvariable.event

    Parte Description
    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 tratado por este procedimento.
  • statements

    Opcional. Bloco de instruções a ser executado dentro deste procedimento.

  • End Sub

    Encerra a definição deste procedimento.

Observações

Todo o código executável deve estar dentro de um procedimento. Use um Sub procedimento quando não quiser retornar um valor para o código de chamada. Use um Function procedimento quando quiser retornar um valor.

Definição de um subprocedimento

Você pode definir um Sub procedimento somente no nível do módulo. O contexto de declaração para um subprocedimento deve, portanto, ser uma classe, uma estrutura, um módulo ou uma interface e não pode ser um arquivo de origem, um namespace, um procedimento ou um bloco. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

Sub procedimentos padrão para acesso público. Você pode ajustar seus níveis de acesso usando os modificadores de acesso.

Se o procedimento usa a Implements palavra-chave, a classe ou estrutura que contém deve ter uma Implements instrução que imediatamente segue sua Class instrução ou Structure . A Implements instrução deve incluir cada interface especificada em implementslist. No entanto, o nome pelo qual uma interface define o Sub (in definedname) não precisa corresponder ao nome deste procedimento (in name).

Retornando de um subprocedimento

Quando um Sub procedimento retorna ao código de chamada, a execução continua com a instrução após a instrução que o chamou.

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

Sub mySub(ByVal q As String)
    Return
End Sub

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

Chamando um subprocedimento

Você chama um Sub procedimento usando o nome do procedimento em uma instrução e, em seguida, seguindo esse nome com sua lista de argumentos entre parênteses. Você pode omitir os parênteses somente se não fornecer nenhum argumento. No entanto, seu código será mais legível se você sempre incluir os parênteses.

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

Você pode usar a palavra-chave quando chamar um Sub procedimento, mas essa palavra-chave não é recomendada para a Call maioria dos usos. Para obter mais informações, consulte Declaração de chamada.

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

Subprocedimentos assíncronos

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

Se você marcar um procedimento com o modificador Async , poderá usar o operador Await no procedimento. Quando o controle atinge uma Await expressão no procedimento, o Async controle retorna ao chamador e o progresso no procedimento é suspenso até que a tarefa aguardada seja concluída. Quando a tarefa estiver concluída, a execução poderá ser retomada no procedimento.

Nota

Um Async procedimento retorna ao chamador quando o primeiro objeto aguardado que ainda não está completo é encontrado ou o final do Async procedimento é atingido, o que ocorrer primeiro.

Você também pode marcar uma instrução de função com o Async modificador. Uma Async função pode ter um tipo de retorno de Task<TResult> ou Task. Um exemplo mais adiante neste tópico mostra uma Async função que tem um tipo de retorno de Task<TResult>.

AsyncSub Os procedimentos são usados principalmente para manipuladores de eventos, onde um valor não pode ser retornado. Um AsyncSub procedimento não pode ser aguardado, e o chamador de um AsyncSub procedimento não pode detetar exceções que o Sub procedimento lança.

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

Para obter mais informações sobre Async procedimentos, consulte Programação assíncrona com Async e Await, Control Flow in Async Programs e Async Return Types.

Exemplo 1

O exemplo a seguir usa a Sub instrução para definir o nome, os parâmetros e o código que formam o corpo de um Sub procedimento.

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

Exemplo 2

No exemplo a seguir, DelayAsync é um AsyncFunction que tem um tipo de retorno de Task<TResult>. DelayAsync tem uma Return instrução que retorna um inteiro. Portanto, a declaração de função de DelayAsync deve ter um tipo de retorno de Task(Of Integer). Como o tipo de retorno é Task(Of Integer), a avaliação da Await expressão em DoSomethingAsync produz um inteiro, como mostra a seguinte instrução: Dim result As Integer = Await delayTask.

O startButton_Click procedimento é um exemplo de procedimento Async Sub . Por DoSomethingAsync ser uma Async função, a tarefa para DoSomethingAsync a chamada deve ser aguardada, como mostra a seguinte declaração: Await DoSomethingAsync(). O startButton_ClickSub procedimento deve ser definido com o Async modificador porque tem uma Await expressão.

' 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