Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
attributelistOpcional. Consulte Lista de Atributos.
accessmodifierOpcional. Pode ser um dos seguintes:
Consulte Níveis de acesso no Visual Basic.
proceduremodifiersOpcional. Pode ser um dos seguintes:
MustOverride OverridesNotOverridable Overrides
SharedOpcional. Ver Partilhado.
ShadowsOpcional. Veja Sombras.
AsyncOpcional. Consulte Async.
IteratorOpcional. Consulte Iterator.
nameObrigatório. Nome do procedimento. Consulte Nomes de elementos declarados.
typeparamlistOpcional. Lista de parâmetros de tipo para um procedimento genérico. Consulte Lista de tipos.
parameterlistOpcional. Lista de nomes de variáveis locais que representam os parâmetros deste procedimento. Consulte Lista de parâmetros.
returntypeObrigatório se
Option StrictforOn. Tipo de dados do valor retornado por este procedimento.ImplementsOpcional. Indica que este procedimento implementa um ou mais
Functionprocedimentos, cada um definido em uma interface implementada pela classe ou estrutura que contém este procedimento. Consulte Declaração de implementos.implementslistNecessário se
Implementsfor fornecido. Lista dosFunctionprocedimentos em curso.implementedprocedure [ , implementedprocedure ... ]Cada
implementedprocedureum tem a seguinte sintaxe e partes:interface.definednameParte Description interfaceObrigatório. Nome de uma interface implementada por este procedimento contendo classe ou estrutura. definednameObrigatório. Nome pelo qual o procedimento é definido em interface.HandlesOpcional. Indica que este procedimento pode manipular um ou mais eventos específicos. Consulte Alças.
eventlistNecessário se
Handlesfor fornecido. Lista de eventos tratados por este procedimento.eventspecifier [ , eventspecifier ... ]Cada
eventspecifierum tem a seguinte sintaxe e partes:eventvariable.eventParte Description eventvariableObrigatório. Variável de objeto declarada com o tipo de dados da classe ou estrutura que gera o evento. eventObrigatório. Nome do evento tratado por este procedimento. statementsOpcional. Bloco de instruções a serem executadas dentro deste procedimento.
End FunctionEncerra 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, Cosou 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 AsyncSub procedimento não pode ser aguardado, e o chamador de um AsyncSub 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 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 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_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