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:
MustOverride Overrides
NotOverridable Overrides
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 aNew
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 dosSub
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>.
Async
Sub
Os procedimentos são usados principalmente para manipuladores de eventos, onde um valor não pode ser retornado. Um Async
Sub
procedimento não pode ser aguardado, e o chamador de um Async
Sub
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 Async
Function
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_Click
Sub
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