Compartir a través de


Function (Instrucción, Visual Basic)

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

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Function ]
    [ statements ]
End Function

Elementos

Término

Definición

attributelist

Opcional. Vea la Lista de atributos.

accessmodifier

Opcional. Puede ser una de las siguientes:

Vea Niveles de acceso en Visual Basic.

proceduremodifiers

Opcional. Puede ser una de las siguientes:

Shared

Opcional. Vea Shared.

Shadows

Opcional. Vea Shadows.

Async

Opcional. Vea Async.

Iterator

Opcional. Vea Iterador.

name

Requerido. Nombre del procedimiento. Vea Nombres de elementos declarados (Visual Basic).

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 (Visual Basic).

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 más procedimientos Function, cada uno de los cuales se define en una interfaz implementada por la clase contenedora o la estructura de este procedimiento. Vea Implements (Instrucción).

implementslist

Requerido si se suministra Implements. Lista de procedimientos Function que se están implementando.

implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure tiene la sintaxis y las partes siguientes:

interface.definedname

Parte

Descripción

interface

Requerido. Nombre de una interfaz implementada por la clase o estructura contenedora de este procedimiento.

definedname

Requerido. Nombre por el que está definido el procedimiento en interface.

Handles

Opcional. Indica que este procedimiento puede controlar uno o más eventos concretos. Vea Handles (Cláusula, Visual Basic).

eventlist

Requerido si se suministra Handles. Lista de eventos que este procedimiento controla.

eventspecifier [ , eventspecifier ... ]

Cada eventspecifier tiene la sintaxis y las partes siguientes:

eventvariable.event

Parte

Descripción

eventvariable

Requerido. Variable de objeto declarada con el tipo de datos de la clase o estructura que provoca el evento.

event

Requerido. Nombre del evento que controla este procedimiento.

statements

Opcional. Bloque de instrucciones que se ejecutan dentro de este procedimiento.

End Function

Termina la definición de este procedimiento.

Comentarios

El código ejecutable debe estar en un procedimiento. Cada procedimiento, a su vez, se declara dentro de una clase, estructura, o módulo que se conoce como la clase contenedora, estructura, o el módulo.

Para devolver un valor al código de llamada, utilice un procedimiento Function ; si no, utilice un procedimiento Sub .

Definición de una función

Puede definir un procedimiento Function sólo en el nivel de módulo. Por consiguiente, 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 Contextos de declaración y niveles de acceso predeterminados (Visual Basic).

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

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

Si este procedimiento utiliza la palabra clave Implements , la clase o estructura debe tener una instrucción Implements que inmediatamente siga la instrucción Class o Structure . La instrucción Implements debe incluir cada interfaz que se especifica en implementslist. Sin embargo, el nombre por el que una interfaz define Function (en definedname) no tiene que coincidir con el nombre de este procedimiento (en name).

Nota

Puede utilizar expresiones lambda para definir expresiones de función inline.Para obtener más información, vea Expresión de función (Visual Basic) y Lambda (expresiones) (Visual Basic).

Volver de una función

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

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

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

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

El ejemplo siguiente asigna el valor devuelto al nombre de función myFunction y, a continuación, utiliza la instrucción Exit Function para volver:

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

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

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

Llamar a una función

Puede llamar a un procedimiento Function con el nombre del procedimiento, seguido por la lista de argumentos entre paréntesis, en una expresión. Puede omitir paréntesis únicamente si no se proporciona ningún argumento. Sin embargo, el código es más legible si se incluyen siempre los paréntesis.

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

También puede llamar a una función utilizando la palabra clave Call . En ese caso, se omite el valor devuelto. El uso de la palabra clave Call no se recomienda en la mayoría de los casos. Para obtener más información, vea Call (Instrucción, Visual Basic).

 Visual Basic reorganiza a veces las expresiones aritméticas para aumentar la eficacia interna. Por esa razón, no debería utilizar un procedimiento Function en una expresión aritmética cuando los cambios de función el valor de las variables en la misma expresión.

Funciones Async

La característica Async permite invocar funciones asincrónicas sin usar devoluciones explícitos o manualmente dividir el código a través de funciones de varias o de expresiones lambda.

Si marca una función con el modificador Async , puede utilizar el operador Espera en la función. Cuando el control alcanza una expresión Await en función Async , el control vuelve al llamador, y el progreso en la función se suspende hasta que la tarea aguardada complete. Cuando finaliza la tarea, la ejecución se puede reanudar en la función.

Nota

Un procedimiento Async vuelve al llamador cuando cualquiera que encuentra el primer objeto aguardado que aún no se completa, recopilar al final del procedimiento Async , lo que ocurre primero.

Una función Async puede tener un tipo de valor devuelto Task o Task. Un ejemplo de una función Async que tenga un tipo de valor devuelto Task se proporciona a continuación.

Una función Async no puede declarar los parámetros ByRef .

Sub (Instrucción, Visual Basic) también se puede marcar con el modificador Async . Esto se utiliza principalmente para los controladores de eventos, donde un valor no se puede devolver. Un procedimiento AsyncSub no puede ser aguardado, y el llamador de un procedimiento AsyncSub no puede detectar las excepciones producidas por el procedimiento Sub .

Para obtener más información sobre las funciones Async , vea Programación asincrónica con Async y Await (C# y Visual Basic), Flujo de control en programas asincrónicos (C# y Visual Basic), y Tipos de valor devuelto de Async (C y Visual Basic).

Funciones de iterador

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

Se llama a un iterador de código de cliente mediante una instrucción For Each… Next .

Tipo de valor devuelto de una función de iterador puede ser IEnumerable, IEnumerable, IEnumerator, o IEnumerator.

Para obtener más información, vea Iteradores (C# y Visual Basic).

Ejemplo

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

En el ejemplo siguiente se invoca a 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

En el ejemplo siguiente, DelayAsync es AsyncFunction que tiene un tipo de valor devuelto Task. DelayAsync tiene una instrucción Return que devuelva un entero. Por consiguiente la declaración de función DelayAsync necesita tener un tipo de valor devuelto Task(Of Integer). Dado que el tipo de valor devuelto es Task(Of Integer), la evaluación de la expresión Await en DoSomethingAsync genera un entero. Esto se muestra en esta instrucción: Dim result As Integer = Await delayTask.

El procedimiento startButton_Click es un ejemplo de un procedimiento Async Sub . Dado que DoSomethingAsync es una función Async , la tarea para la llamada a DoSomethingAsync debe ser aguardada, como la instrucción siguiente muestra: Await DoSomethingAsync(). El procedimiento startButton_ClickSub debe definirse con el modificador Async porque tiene una expresión 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

Vea también

Tareas

Cómo: Usar clases genéricas (Visual Basic)

Solucionar problemas de procedimientos (Visual Basic)

Referencia

Sub (Instrucción, Visual Basic)

Lista de parámetros (Visual Basic)

Instrucción Dim (Visual Basic)

Call (Instrucción, Visual Basic)

Of (Cláusula, Visual Basic)

Expresión de función (Visual Basic)

Conceptos

Procedimientos de función (Visual Basic)

Matrices de parámetros (Visual Basic)

Lambda (expresiones) (Visual Basic)