Function (Instrucción, Visual Basic)Function Statement (Visual Basic)

Declara el nombre, los parámetros y el código que definen un procedimiento Function.Declares the name, parameters, and code that define a Function procedure.

SintaxisSyntax

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

ElementosParts

  • attributelist

    Opcional.Optional. Vea lista de atributos.See Attribute List.

  • accessmodifier

    Opcional.Optional. Puede ser uno de los siguientes:Can be one of the following:

    Vea Access levels in Visual Basic.See Access levels in Visual Basic.

  • proceduremodifiers

    Opcional.Optional. Puede ser uno de los siguientes:Can be one of the following:

  • Shared

    Opcional.Optional. Vea Shared.See Shared.

  • Shadows

    Opcional.Optional. Vea Shadows.See Shadows.

  • Async

    Opcional.Optional. Vea Async.See Async.

  • Iterator

    Opcional.Optional. Vea iterator.See Iterator.

  • name

    Requerido.Required. Nombre del procedimiento.Name of the procedure. Vea Declared Element Names.See Declared Element Names.

  • typeparamlist

    Opcional.Optional. Lista de parámetros de tipo para un procedimiento genérico.List of type parameters for a generic procedure. Consulte lista de tipos.See Type List.

  • parameterlist

    Opcional.Optional. Lista de nombres de variables locales que representan los parámetros de este procedimiento.List of local variable names representing the parameters of this procedure. Vea lista de parámetros.See Parameter List.

  • returntype

    Es obligatorio si se On Option Strict.Required if Option Strict is On. Tipo de datos del valor devuelto por este procedimiento.Data type of the value returned by this procedure.

  • Implements

    Opcional.Optional. Indica que este procedimiento implementa uno o varios procedimientos de Function, cada uno de los cuales se define en una interfaz implementada por la clase o estructura contenedora de este procedimiento.Indicates that this procedure implements one or more Function procedures, each one defined in an interface implemented by this procedure's containing class or structure. Vea Implements (instrucción).See Implements Statement.

  • implementslist

    Es necesario si se proporciona Implements.Required if Implements is supplied. Lista de procedimientos Function que se implementan.List of Function procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    Cada implementedprocedure tiene la sintaxis y las partes siguientes:Each implementedprocedure has the following syntax and parts:

    interface.definedname

    PartePart DescripciónDescription
    interface Requerido.Required. Nombre de una interfaz implementada por la clase o estructura contenedora de este procedimiento.Name of an interface implemented by this procedure's containing class or structure.
    definedname Requerido.Required. Nombre por el que se define el procedimiento en interface.Name by which the procedure is defined in interface.
  • Handles

    Opcional.Optional. Indica que este procedimiento puede controlar uno o más eventos concretos.Indicates that this procedure can handle one or more specific events. Vea identificadores.See Handles.

  • eventlist

    Es necesario si se proporciona Handles.Required if Handles is supplied. Lista de eventos que controla este procedimiento.List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    Cada eventspecifier tiene la sintaxis y las partes siguientes:Each eventspecifier has the following syntax and parts:

    eventvariable.event

    PartePart DescripciónDescription
    eventvariable Requerido.Required. Variable de objeto declarada con el tipo de datos de la clase o estructura que genera el evento.Object variable declared with the data type of the class or structure that raises the event.
    event Requerido.Required. Nombre del evento que controla este procedimiento.Name of the event this procedure handles.
  • statements

    Opcional.Optional. Bloque de instrucciones que se ejecutarán en este procedimiento.Block of statements to be executed within this procedure.

  • End Function

    Finaliza la definición de este procedimiento.Terminates the definition of this procedure.

ComentariosRemarks

Todo el código ejecutable debe estar dentro de un procedimiento.All executable code must be inside a procedure. Cada procedimiento, a su vez, se declara dentro de una clase, una estructura o un módulo al que se hace referencia como la clase, estructura o módulo contenedor.Each procedure, in turn, is declared within a class, a structure, or a module that is referred to as the containing class, structure, or module.

Para devolver un valor al código de llamada, use un procedimiento Function; de lo contrario, use un procedimiento Sub.To return a value to the calling code, use a Function procedure; otherwise, use a Sub procedure.

Definir una funciónDefining a Function

Solo puede definir un procedimiento Function en el nivel de módulo.You can define a Function procedure only at the module level. Por lo tanto, el contexto de la 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.Therefore, the declaration context for a function must be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).For more information, see Declaration Contexts and Default Access Levels.

Function procedimientos tienen como valor predeterminado el acceso público.Function procedures default to public access. Los niveles de acceso se pueden ajustar con los modificadores de acceso.You can adjust their access levels with the access modifiers.

Un procedimiento Function puede declarar el tipo de datos del valor que devuelve el procedimiento.A Function procedure can declare the data type of the value that the procedure returns. Puede especificar cualquier tipo de datos o el nombre de una enumeración, una estructura, una clase o una interfaz.You can specify any data type or the name of an enumeration, a structure, a class, or an interface. Si no especifica el parámetro returntype, el procedimiento devuelve Object.If you don't specify the returntype parameter, the procedure returns Object.

Si este procedimiento usa la palabra clave Implements, la clase o estructura contenedora también debe tener una instrucción Implements que siga inmediatamente a su instrucción Class o Structure.If this procedure uses the Implements keyword, the containing class or structure must also have an Implements statement that immediately follows its Class or Structure statement. La instrucción Implements debe incluir cada interfaz que se especifica en implementslist.The Implements statement must include each interface that's specified in implementslist. Sin embargo, el nombre por el que una interfaz define el Function (en definedname) no tiene que coincidir con el nombre de este procedimiento (en name).However, the name by which an interface defines the Function (in definedname) doesn't need to match the name of this procedure (in name).

Nota

Puede usar expresiones lambda para definir expresiones de función alineadas.You can use lambda expressions to define function expressions inline. Para obtener más información, vea expresión de función y expresiones lambda.For more information, see Function Expression and Lambda Expressions.

Devolver desde una funciónReturning from a Function

Cuando el procedimiento Function devuelve al código de llamada, la ejecución continúa con la instrucción que sigue a la instrucción que llamó al procedimiento.When the Function procedure returns to the calling code, execution continues with the statement that follows the statement that called the procedure.

Para devolver un valor de una función, puede asignar el valor al nombre de la función o incluirlo en una instrucción Return.To return a value from a function, you can either assign the value to the function name or include it in a Return statement.

La instrucción Return asigna simultáneamente el valor devuelto y sale de la función, como se muestra en el ejemplo siguiente.The Return statement simultaneously assigns the return value and exits the function, as the following example shows.

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 función myFunction y, a continuación, se usa la instrucción Exit Function para devolver.The following example assigns the return value to the function name myFunction and then uses the Exit Function statement to return.

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

Las instrucciones Exit Function y Return producen una salida inmediata de un procedimiento de Function.The Exit Function and Return statements cause an immediate exit from a Function procedure. Cualquier número de instrucciones Exit Function y Return puede aparecer en cualquier parte del procedimiento y se pueden mezclar instrucciones Exit Function y Return.Any number of Exit Function and Return statements can appear anywhere in the procedure, and you can mix Exit Function and Return statements.

Si usa Exit Function sin asignar un valor a name, el procedimiento devuelve el valor predeterminado para el tipo de datos especificado en returntype.If you use Exit Function without assigning a value to name, the procedure returns the default value for the data type that's specified in returntype. Si no se especifica returntype, el procedimiento devuelve Nothing, que es el valor predeterminado para Object.If returntype isn't specified, the procedure returns Nothing, which is the default value for Object.

Llamar a una funciónCalling a Function

Se llama a un procedimiento de Function mediante el nombre del procedimiento, seguido de la lista de argumentos entre paréntesis, en una expresión.You call a Function procedure by using the procedure name, followed by the argument list in parentheses, in an expression. Solo se pueden omitir los paréntesis si no se proporcionan argumentos.You can omit the parentheses only if you aren't supplying any arguments. Sin embargo, el código es más legible si siempre incluye los paréntesis.However, your code is more readable if you always include the parentheses.

Se llama a un procedimiento Function del mismo modo que se llama a cualquier función de biblioteca como Sqrt, Cos o ChrW.You call a Function procedure the same way that you call any library function such as Sqrt, Cos, or ChrW.

También puede llamar a una función mediante la palabra clave Call.You can also call a function by using the Call keyword. En ese caso, se omite el valor devuelto.In that case, the return value is ignored. No se recomienda el uso de la palabra clave Call en la mayoría de los casos.Use of the Call keyword isn't recommended in most cases. Para obtener más información, consulte instrucción call.For more information, see Call Statement.

A veces Visual Basic reorganiza las expresiones aritméticas para aumentar la eficacia interna.Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. Por ese motivo, no debe utilizar un procedimiento Function en una expresión aritmética cuando la función cambia el valor de las variables en la misma expresión.For that reason, you shouldn't use a Function procedure in an arithmetic expression when the function changes the value of variables in the same expression.

Funciones asincrónicasAsync Functions

La característica Async le permite invocar funciones asincrónicas sin usar devoluciones de llamada explícitas ni dividir manualmente el código en varias funciones o expresiones lambda.The Async feature allows you to invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

Si marca una función con el modificador Async , puede usar el operador Await en la función.If you mark a function with the Async modifier, you can use the Await operator in the function. Cuando el control alcanza una expresión Await en la función Async, el control vuelve al llamador y el progreso de la función se suspende hasta que se completa la tarea esperada.When control reaches an Await expression in the Async function, control returns to the caller, and progress in the function is suspended until the awaited task completes. Una vez completada la tarea, la ejecución puede reanudarse en la función.When the task is complete, execution can resume in the function.

Nota

Un procedimiento Async devuelve al autor de la llamada cuando encuentra el primer objeto esperado que aún no se ha completado o hasta el final de la Async procedimiento, lo que ocurra primero.An Async procedure returns to the caller when either it encounters the first awaited object that’s not yet complete, or it gets to the end of the Async procedure, whichever occurs first.

Una función Async puede tener un tipo de valor devuelto de Task<TResult> o Task.An Async function can have a return type of Task<TResult> or Task. A continuación se proporciona un ejemplo de una función de Async que tiene un tipo de valor devuelto de Task<TResult>.An example of an Async function that has a return type of Task<TResult> is provided below.

Una función Async no puede declarar ningún parámetro ByRef .An Async function cannot declare any ByRef parameters.

Una instrucción Sub también se puede marcar con el modificador Async.A Sub Statement can also be marked with the Async modifier. Se utiliza principalmente para los controladores de eventos, donde no se puede devolver un valor.This is primarily used for event handlers, where a value cannot be returned. No se puede esperar a un procedimiento de Sub de Async, y el llamador de un procedimiento de Sub de Async no puede detectar las excepciones producidas por el procedimiento Sub.An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that are thrown by the Sub procedure.

Para obtener más información sobre las funciones de Async, vea programación asincrónica con Async y Await, flujo de control en programas asincrónicosy tipos de valor devueltos asincrónicos.For more information about Async functions, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

Funciones de iteradorIterator Functions

Una función de iterador realiza una iteración personalizada en una colección, como una lista o una matriz.An iterator function performs a custom iteration over a collection, such as a list or array. Una función de iterador utiliza la instrucción yield para devolver cada elemento de uno en uno.An iterator function uses the Yield statement to return each element one at a time. Cuando se alcanza una instrucción yield , se recuerda la ubicación actual en el código.When a Yield statement is reached, the current location in code is remembered. La ejecución se reinicia desde esa ubicación la próxima vez que se llama a la función del iterador.Execution is restarted from that location the next time the iterator function is called.

Se llama a un iterador desde el código de cliente mediante un método for each... Instrucción siguiente .You call an iterator from client code by using a For Each…Next statement.

El tipo de valor devuelto de una función de iterador puede ser IEnumerable, IEnumerable<T>, IEnumerator o IEnumerator<T>.The return type of an iterator function can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Para más información, vea Iteradores.For more information, see Iterators.

EjemploExample

En el ejemplo siguiente se usa la instrucción Function para declarar el nombre, los parámetros y el código que forman el cuerpo de un procedimiento Function.The following example uses the Function statement to declare the name, parameters, and code that form the body of a Function procedure. El modificador ParamArray permite que la función acepte un número variable de argumentos.The ParamArray modifier enables the function to accept a variable number of arguments.

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

EjemploExample

En el ejemplo siguiente se invoca la función declarada en el ejemplo anterior.The following example invokes the function declared in the preceding example.

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

EjemploExample

En el ejemplo siguiente, DelayAsync es un Function de Async que tiene un tipo de valor devuelto de Task<TResult>.In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync tiene una instrucción Return que devuelve un entero.DelayAsync has a Return statement that returns an integer. Por lo tanto, la declaración de función de DelayAsync debe tener un tipo de valor devuelto de Task(Of Integer).Therefore the function declaration of DelayAsync needs to have a return type of Task(Of Integer). Dado que el tipo de valor devuelto es Task(Of Integer), la evaluación de la expresión de Await en DoSomethingAsync produce un entero.Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer. Esto se muestra en esta instrucción: Dim result As Integer = Await delayTask.This is demonstrated in this statement: Dim result As Integer = Await delayTask.

El procedimiento startButton_Click es un ejemplo de un procedimiento Async Sub.The startButton_Click procedure is an example of an Async Sub procedure. Dado que DoSomethingAsync es una función Async, se debe esperar la tarea para la llamada a DoSomethingAsync, como se muestra en la siguiente instrucción: Await DoSomethingAsync().Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement demonstrates: Await DoSomethingAsync(). El procedimiento de Sub de startButton_Click debe definirse con el modificador Async porque tiene una expresión de Await.The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' 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énSee also