Instrução de função (Visual Basic)
Declara o nome, os parâmetros e o código que definem um Function
procedimento.
Sintaxe
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function
Partes
attributelist
Opcional. Consulte Lista de Atributos.
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.
Iterator
Opcional. Consulte Iterator.
name
Obrigatório. Nome do procedimento. Consulte Nomes de elementos declarados.
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.
returntype
Obrigatório se
Option Strict
forOn
. Tipo de dados do valor retornado por este procedimento.Implements
Opcional. Indica que este procedimento implementa um ou mais
Function
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 dosFunction
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 serem executadas dentro deste procedimento.
End Function
Encerra a definição deste procedimento.
Observações
Todo o código executável deve estar dentro de um procedimento. Cada procedimento, por sua vez, é declarado dentro de uma classe, uma estrutura ou um módulo que é referido como a classe, estrutura ou módulo que contém.
Para retornar um valor ao código de chamada, use um Function
procedimento, caso contrário, use um Sub
procedimento.
Definindo uma função
Você pode definir um Function
procedimento somente no nível do módulo. Portanto, o contexto de declaração para uma função deve 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.
Function
procedimentos padrão para acesso público. Você pode ajustar seus níveis de acesso com os modificadores de acesso.
Um Function
procedimento pode declarar o tipo de dados do valor que o procedimento retorna. Você pode especificar qualquer tipo de dados ou o nome de uma enumeração, uma estrutura, uma classe ou uma interface. Se você não especificar o returntype
parâmetro, o procedimento retornará Object
.
Se este procedimento usa a Implements
palavra-chave, a classe ou estrutura que contém també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 Function
(in definedname
) não precisa corresponder ao nome deste procedimento (in name
).
Nota
Você pode usar expressões lambda para definir expressões de função embutidas. Para obter mais informações, consulte Expressão de função e expressões do Lambda.
Retornando de uma função
Quando o Function
procedimento retorna ao código de chamada, a execução continua com a instrução que segue a instrução que chamou o procedimento.
Para retornar um valor de uma função, você pode atribuir o valor ao nome da função ou incluí-lo em uma Return
instrução.
A Return
instrução atribui simultaneamente o valor de retorno e sai da função, como mostra o exemplo a seguir.
Function MyFunction(ByVal j As Integer) As Double
Return 3.87 * j
End Function
O exemplo a seguir atribui o valor de retorno ao nome myFunction
da função e, em seguida, usa a Exit Function
instrução para retornar.
Function MyFunction(ByVal j As Integer) As Double
MyFunction = 3.87 * j
Exit Function
End Function
As Exit Function
declarações e Return
causam uma saída imediata de um Function
procedimento. Qualquer número de Exit Function
e Return
instruções pode aparecer em qualquer lugar no procedimento, e você pode misturar Exit Function
e Return
declarações.
Se você usar Exit Function
sem atribuir um valor ao name
, o procedimento retornará o valor padrão para o tipo de dados especificado em returntype
. Se returntype
não for especificado, o procedimento retornará Nothing
, que é o valor padrão para Object
.
Chamando uma função
Você chama um Function
procedimento usando o nome do procedimento, seguido pela lista de argumentos entre parênteses, em uma expressão. Você pode omitir os parênteses somente se não estiver fornecendo nenhum argumento. No entanto, seu código será mais legível se você sempre incluir os parênteses.
Você chama um Function
procedimento da mesma forma que chama qualquer função de biblioteca, como Sqrt
, Cos
ou ChrW
.
Você também pode chamar uma função usando a Call
palavra-chave. Nesse caso, o valor de retorno é ignorado. O uso da Call
palavra-chave não é recomendado na maioria dos casos. 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, você não deve usar um Function
procedimento em uma expressão aritmética quando a função altera o valor de variáveis na mesma expressão.
Funções assíncronas
O recurso Assíncrono permite que você invoque 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 uma função com o modificador Async , poderá usar o operador Await na função. Quando o controle atinge uma Await
expressão na função, o Async
controle retorna ao chamador e o progresso na função é suspenso até que a tarefa esperada seja concluída. Quando a tarefa estiver concluída, a execução pode ser retomada na função.
Nota
Um Async
procedimento retorna ao chamador quando encontra o primeiro objeto aguardado que ainda não está concluído ou chega ao final do procedimento, o Async
que ocorrer primeiro.
Uma Async
função pode ter um tipo de retorno de Task<TResult> ou Task. Um exemplo de uma Async
função que tem um tipo de retorno é Task<TResult> fornecido abaixo.
Uma Async
função não pode declarar nenhum parâmetro ByRef .
Uma subinstrução também pode ser marcada com o Async
modificador. Isso é usado 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 são lançadas Sub
pelo procedimento.
Para obter mais informações sobre Async
funções, consulte Programação assíncrona com Async e Await, Control Flow in Async Programs e Async Return Types.
Funções do iterador
Uma função iteradora executa uma iteração personalizada sobre uma coleção, como uma lista ou matriz. Uma função iteradora usa a instrução Yield para retornar cada elemento, um de cada vez. Quando uma declaração de rendimento é atingida, o local atual no código é lembrado. A execução é reiniciada a partir desse local na próxima vez que a função iterador for chamada.
Você chama um iterador do código do cliente usando um For Each... Próxima declaração.
O tipo de retorno de uma função iteradora pode ser IEnumerable, IEnumerable<T>, IEnumerator, ou IEnumerator<T>.
Para obter mais informações, consulte Iteradores.
Exemplo 1
O exemplo a seguir usa a Function
instrução para declarar o nome, os parâmetros e o código que formam o corpo de um Function
procedimento. O ParamArray
modificador permite que a função aceite um número variável de argumentos.
Public Function CalcSum(ByVal ParamArray args() As Double) As Double
CalcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
CalcSum += args(i)
Next i
End Function
Exemplo 2
O exemplo a seguir invoca a função declarada no exemplo anterior.
Module Module1
Sub Main()
' In the following function call, CalcSum's local variables
' are assigned the following values: args(0) = 4, args(1) = 3,
' and so on. The displayed sum is 10.
Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
Console.WriteLine("Sum: " & returnedValue)
' Parameter args accepts zero or more arguments. The sum
' displayed by the following statements is 0.
returnedValue = CalcSum()
Console.WriteLine("Sum: " & returnedValue)
End Sub
Public Function CalcSum(ByVal ParamArray args() As Double) As Double
CalcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
CalcSum += args(i)
Next i
End Function
End Module
Exemplo 3
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
precisa 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. Isto é demonstrado nesta declaração: Dim result As Integer = Await delayTask
.
O startButton_Click
procedimento é um exemplo de procedimento Async Sub
. Por DoSomethingAsync
se tratar de uma Async
função, a tarefa para DoSomethingAsync
a chamada deve ser aguardada, como demonstra a seguinte afirmaçã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