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
attributelistOpcional. Vea Lista de atributos.
accessmodifierOpcional. Puede ser uno de los siguientes:
Consulte Niveles de acceso en Visual Basic.
proceduremodifiersOpcional. Puede ser uno de los siguientes:
MustOverride OverridesNotOverridable Overrides
SharedOpcional. Vea Compartido.
ShadowsOpcional. Vea Sombras.
AsyncOpcional. Vea Async.
IteratorOpcional. Vea Iterator.
nameNecesario. Nombre del procedimiento. Vea Declared Element Names.
typeparamlistOpcional. Lista de parámetros de tipo para un procedimiento genérico. Vea Lista de tipos.
parameterlistOpcional. Lista de nombres de variables locales que representan los parámetros de este procedimiento. Vea Lista de parámetros.
returntypeObligatorio si
Option StrictesOn. Tipo de datos del valor devuelto por este procedimiento.ImplementsOpcional. Indica que este procedimiento implementa uno o varios procedimientos, cada uno definido en una interfaz implementada por la clase o estructura que contiene
Functioneste procedimiento. Vea Implements (Instrucción).implementslistEs necesario si se proporciona
Implements. Lista de procedimientosFunctionque se implementan.implementedprocedure [ , implementedprocedure ... ]Cada
implementedproceduretiene la sintaxis y las partes siguientes:interface.definednameParte Descripción interfaceNecesario. Nombre de una interfaz implementada por la clase o estructura que contiene este procedimiento. definednameNecesario. Nombre por el que se define el procedimiento en interface.HandlesOpcional. Indica que este procedimiento puede controlar uno o varios eventos específicos. Vea Identificadores.
eventlistEs necesario si se proporciona
Handles. Lista de eventos que controla este procedimiento.eventspecifier [ , eventspecifier ... ]Cada
eventspecifiertiene la sintaxis y las partes siguientes:eventvariable.eventParte Descripción eventvariableNecesario. Variable de objeto declarada con el tipo de datos de la clase o estructura que genera el evento. eventNecesario. Nombre del evento que controla este procedimiento. statementsOpcional. Bloque de instrucciones que se ejecutarán dentro de este procedimiento.
End FunctionFinaliza 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