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:

  • 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 for On. 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 dos Function 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, 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 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

Consulte também