Function (Instrucción, Visual Basic)

Declara el nombre, los parámetros y el código que definen un Function procedimiento.

Sintaxis

[ <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. Vea Lista de atributos.

  • accessmodifier

    Opcional. Puede ser uno de los siguientes:

    Consulte Niveles de acceso en Visual Basic.

  • proceduremodifiers

    Opcional. Puede ser uno de los siguientes:

  • Shared

    Opcional. Vea Compartido.

  • Shadows

    Opcional. Vea Sombras.

  • Async

    Opcional. Vea Async.

  • Iterator

    Opcional. Vea Iterator.

  • name

    Necesario. Nombre del procedimiento. Vea Declared Element Names.

  • typeparamlist

    Opcional. Lista de parámetros de tipo para un procedimiento genérico. Vea Lista de tipos.

  • parameterlist

    Opcional. Lista de nombres de variables locales que representan los parámetros de este procedimiento. Vea Lista de parámetros.

  • returntype

    Obligatorio si Option Strict es On . Tipo de datos del valor devuelto por este procedimiento.

  • Implements

    Opcional. Indica que este procedimiento implementa uno o varios procedimientos, cada uno definido en una interfaz implementada por la clase o estructura que contiene Function este procedimiento. Vea Implements (Instrucción).

  • implementslist

    Es necesario si se proporciona Implements. Lista de procedimientos Function que se implementan.

    implementedprocedure [ , implementedprocedure ... ]

    Cada implementedprocedure tiene la sintaxis y las partes siguientes:

    interface.definedname

    Parte Descripción
    interface Necesario. Nombre de una interfaz implementada por la clase o estructura que contiene este procedimiento.
    definedname Necesario. Nombre por el que se define el procedimiento en interface.
  • Handles

    Opcional. Indica que este procedimiento puede controlar uno o varios eventos específicos. Vea Identificadores.

  • eventlist

    Es necesario si se proporciona Handles. Lista de eventos que controla este procedimiento.

    eventspecifier [ , eventspecifier ... ]

    Cada eventspecifier tiene la sintaxis y las partes siguientes:

    eventvariable.event

    Parte Descripción
    eventvariable Necesario. Variable de objeto declarada con el tipo de datos de la clase o estructura que genera el evento.
    event Necesario. Nombre del evento que controla este procedimiento.
  • statements

    Opcional. Bloque de instrucciones que se ejecutarán dentro de este procedimiento.

  • End Function

    Finaliza la definición de este procedimiento.

Comentarios

Todo el código ejecutable debe estar dentro de un procedimiento. Cada procedimiento, a su vez, se declara dentro de una clase, una estructura o un módulo al que se hace referencia como clase, estructura o módulo que lo contiene.

Para devolver un valor al código de llamada, use un Function procedimiento; de lo contrario, use un Sub procedimiento .

Definir una función

Solo puede definir un Function procedimiento en el nivel de módulo. Por lo tanto, el contexto de declaración de una función debe ser una clase, una estructura, un módulo o una interfaz y no puede ser un archivo de código fuente, un espacio de nombres, un procedimiento o un bloque. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).

Function Los procedimientos tienen como valor predeterminado el acceso público. Los niveles de acceso se pueden ajustar con los modificadores de acceso.

Un Function procedimiento puede declarar el tipo de datos del valor que devuelve el procedimiento. Puede especificar cualquier tipo de datos o el nombre de una enumeración, una estructura, una clase o una interfaz. Si no especifica el parámetro returntype , el procedimiento devuelve Object .

Si este procedimiento usa la palabra clave , la clase o estructura que contiene también debe tener una instrucción que siga Implements inmediatamente a su instrucción o Implements Class Structure . La Implements instrucción debe incluir cada interfaz especificada en implementslist . Sin embargo, el nombre por el que una interfaz define (en ) no necesita coincidir con el Function nombre de este procedimiento definedname (en name ).

Nota

Puede usar expresiones lambda para definir expresiones de función insertados. Para más información, consulte Expresiones de función y Expresiones lambda.

Devolver de una función

Cuando el procedimiento vuelve al código de llamada, la ejecución continúa con la instrucción que sigue a Function la instrucción que llamó al procedimiento.

Para devolver un valor de una función, puede asignar el valor al nombre de la función o incluirlo en una Return instrucción .

La instrucción asigna simultáneamente el valor devuelto y sale de Return la función, como se muestra en el ejemplo siguiente.

Function MyFunction(ByVal j As Integer) As Double
    Return 3.87 * j
End Function

En el ejemplo siguiente se asigna el valor devuelto al nombre de la función y, a myFunction continuación, se usa Exit Function la instrucción para devolver.

Function MyFunction(ByVal j As Integer) As Double
    MyFunction = 3.87 * j
    Exit Function
End Function

Las Exit Function instrucciones y provocan una salida inmediata de un Return Function procedimiento. Cualquier número de Exit Function instrucciones y puede aparecer en cualquier parte del Return procedimiento, y puede mezclar instrucciones Exit Function y Return .

Si usa sin asignar un valor a , el procedimiento devuelve el valor predeterminado para el tipo de datos Exit Function name especificado en returntype . Si returntype no se especifica , el procedimiento devuelve , que es el valor predeterminado para Nothing Object .

Llamar a una función

Se llama a Function un procedimiento mediante el nombre del procedimiento, seguido de la lista de argumentos entre paréntesis, en una expresión. Puede omitir los paréntesis solo si no proporciona ningún argumento. Sin embargo, el código es más legible si siempre incluye paréntesis.

Se llama a un procedimiento de la misma manera que se llama a cualquier función de Function biblioteca, como Sqrt , o Cos ChrW .

También puede llamar a una función mediante la palabra Call clave . En ese caso, se omite el valor devuelto. No se recomienda el Call uso de la palabra clave en la mayoría de los casos. Para obtener más información, vea Call Statement.

Visual Basic a veces reorganiza las expresiones aritméticas para aumentar la eficacia interna. Por ese motivo, no debe usar un procedimiento en una expresión aritmética cuando la función cambia el valor de Function las variables de la misma expresión.

Funciones asincrónicas

La característica Async permite invocar funciones asincrónicas sin usar devoluciones de llamada explícitas ni dividir manualmente el código entre varias funciones o expresiones lambda.

Si marca una función con el modificador Async, puede usar el operador Await en la función. Cuando el control alcanza una expresión en la función, el control vuelve al autor de la llamada y el progreso de la función se suspende hasta que se completa Await Async la tarea esperada. Una vez completada la tarea, la ejecución se puede reanudar en la función .

Nota

Un procedimiento vuelve al autor de la llamada cuando encuentra el primer objeto en espera que aún no está completo o llega al final del procedimiento, lo que ocurra Async Async primero.

Una Async función puede tener un tipo de valor devuelto de o Task<TResult> Task . A continuación se proporciona un ejemplo de una función que Async tiene un tipo de valor devuelto de Task<TResult> .

Una Async función no puede declarar ningún parámetro ByRef.

Una instrucción Sub también se puede marcar con el modificador Async . Esto se usa principalmente para los controladores de eventos, donde no se puede devolver un valor. No se puede esperar a un procedimiento y el autor de la llamada de un procedimiento no puede detectar excepciones Async Sub Async Sub producidas por el Sub procedimiento.

Para obtener más información sobre las funciones, vea Programación asincrónica con Async y Await , Control Flow en Async Async Programsy Async Return Types.

Funciones de iterador

Una función de iterador realiza una iteración personalizada en una colección, como una lista o una matriz. Una función de iterador usa la instrucción Yield para devolver cada elemento de uno en uno. Cuando se alcanza una instrucción Yield, se recuerda la ubicación actual en el código. La ejecución se reinicia desde esa ubicación la próxima vez que se llama a la función del iterador.

Para llamar a un iterador desde el código de cliente, use for Each... Instrucción siguiente.

El tipo de valor devuelto de una función de iterador puede IEnumerable ser , , o IEnumerable<T> IEnumerator IEnumerator<T> .

Para obtener más información, consulta Iteradores.

Ejemplo 1

En el ejemplo siguiente se usa la instrucción para declarar el nombre, los parámetros y el código que Function forman el cuerpo de un Function procedimiento. El ParamArray modificador permite que la función acepte un número variable 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

Ejemplo 2

En el ejemplo siguiente se invoca la función declarada en el ejemplo 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

Ejemplo 3

En el ejemplo siguiente, DelayAsync es un objeto que tiene un tipo de valor devuelto de Async Function Task<TResult> . DelayAsync tiene una instrucción Return que devuelve un entero. Por lo tanto, la DelayAsync declaración de función de debe tener un tipo de valor devuelto de Task(Of Integer) . Dado que el tipo de valor devuelto es Task(Of Integer) , la evaluación de la expresión en genera un Await DoSomethingAsync entero. Esto se muestra en esta instrucción: Dim result As Integer = Await delayTask .

El startButton_Click procedimiento es un ejemplo de un Async Sub procedimiento. Dado que es una función, se debe esperar la tarea para la llamada a , como se muestra DoSomethingAsync Async en la siguiente DoSomethingAsync instrucción: Await DoSomethingAsync() . El startButton_Click Sub procedimiento debe definirse con el Async modificador porque tiene una Await expresión.

' 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

Consulta también