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: |
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 elementos 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ído (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
ParteDescriçã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
ParteDescriçã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. |
EndSub |
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 Níveis de acesso padrão (Visual Basic) e os contextos de declaração.
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 de chamada (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.
Observação |
---|
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 de função (Visual Basic) com o modificador de Async .uma função de Async pode ter um tipo de retorno de Task<TResult> 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<TResult>.
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 com Async assíncrona e esperar (C# e Visual Basic), Fluxo de controle em programas Async (C# e Visual Basic), e Tipos de retorno de Async (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<TResult>.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)
Procedimentos de solução de problemas (Visual Basic)
Referência
Instrução de função (Visual Basic)
Lista de parâmetros (Visual Basic)
Instrução de chamada (Visual Basic)