Sub (Instrucción, Visual Basic)
Declara el nombre, los parámetros y el código que definen un Sub procedimiento.
Sintaxis
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub
Partes
attributelistOpcional. Vea Lista de atributos.
PartialOpcional. Indica la definición de un método parcial. Vea Métodos parciales.
accessmodifierOpcional. Puede ser uno de los siguientes:
proceduremodifiersOpcional. Puede ser uno de los siguientes:
MustOverride OverridesNotOverridable Overrides
SharedOpcional. Vea Compartido.
ShadowsOpcional. Vea Sombras.
AsyncOpcional. Vea Async.
nameNecesario. Nombre del procedimiento. Vea Declared Element Names. Para crear un procedimiento de constructor para una clase, establezca el nombre de un
Subprocedimiento en la palabra claveNew. Para obtener más información, vea Duración de objetos: Cómo se crean y destruyen los objetos.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.
ImplementsOpcional. Indica que este procedimiento implementa uno o varios procedimientos, cada uno definido en una interfaz implementada por la clase o estructura que contiene
Subeste procedimiento. Vea Implements (Instrucción).implementslistEs necesario si se proporciona
Implements. Lista de procedimientosSubque 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 SubFinaliza la definición de este procedimiento.
Comentarios
Todo el código ejecutable debe estar dentro de un procedimiento. Use un Sub procedimiento cuando no desee devolver un valor al código de llamada. Use un Function procedimiento cuando desee devolver un valor.
Definición de un sub procedimiento
Solo puede definir un Sub procedimiento en el nivel de módulo. Por lo tanto, el contexto de declaración de un sub procedimiento 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).
Sub Los procedimientos tienen como valor predeterminado el acceso público. Puede ajustar sus niveles de acceso mediante los modificadores de acceso.
Si el procedimiento usa la palabra clave , la clase o estructura que contiene debe tener una instrucción que siga inmediatamente Implements 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 tiene que coincidir con el nombre Sub definedname de este procedimiento (en name ).
Devolver desde un sub procedimiento
Cuando un procedimiento vuelve al código de llamada, la ejecución continúa con la instrucción después de Sub la instrucción que lo llamó.
En el ejemplo siguiente se muestra una devolución de un Sub procedimiento.
Sub mySub(ByVal q As String)
Return
End Sub
Las Exit Sub instrucciones y provocan una salida inmediata de un Return Sub procedimiento. Cualquier número de instrucciones y puede aparecer en cualquier Exit Sub Return parte del procedimiento, y puede mezclar Exit Sub instrucciones y Return .
Llamar a un sub procedimiento
Para llamar a un procedimiento, use el nombre del procedimiento en una instrucción y, a continuación, haga clic en ese nombre con su lista de Sub argumentos entre paréntesis. Puede omitir los paréntesis solo si no proporciona ningún argumento. Sin embargo, el código es más legible si siempre incluye los paréntesis.
Un Sub procedimiento y un procedimiento pueden tener parámetros y realizar una serie de Function instrucciones. Sin embargo, Function un procedimiento devuelve un valor y un procedimiento Sub no. Por lo tanto, no se puede usar un Sub procedimiento en una expresión.
Puede usar la palabra clave al llamar a un procedimiento, pero esa palabra clave Call no se recomienda para la mayoría de los Sub usos. 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, si la lista de argumentos incluye expresiones que llaman a otros procedimientos, no debe suponer que se llamará a esas expresiones en un orden determinado.
Procedimientos asincrónicos
Mediante el uso de la característica Async, puede 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 un procedimiento con el modificador Async, puede usar el operador Await en el procedimiento. Cuando el control alcanza una expresión en el procedimiento, el control vuelve al autor de la llamada y el progreso del procedimiento se suspende hasta que se completa Await Async la tarea esperada. Una vez completada la tarea, la ejecución se puede reanudar en el procedimiento.
Nota
Un procedimiento vuelve al autor de la llamada cuando se encuentra el primer objeto en espera que aún no está completo o se alcanza el final del procedimiento, lo que ocurra Async Async primero.
También puede marcar una instrucción function con el modificador Async . Una Async función puede tener un tipo de valor devuelto de o Task<TResult> Task . Un ejemplo más adelante en este tema muestra una Async función que tiene un tipo de valor devuelto de Task<TResult> .
Async``SubLos procedimientos se usan 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 las excepciones Async Sub que produce el Async Sub Sub procedimiento.
Un Async procedimiento no puede declarar ningún parámetro ByRef.
Para obtener más información sobre los procedimientos, vea Programación asincrónica con Async y Await , Control Flow en Async Async Programsy Async Return Types.
Ejemplo 1
En el ejemplo siguiente se usa la instrucción para definir el nombre, los parámetros y el Sub código que forman el cuerpo de un Sub procedimiento.
Sub ComputeArea(ByVal length As Double, ByVal width As Double)
' Declare local variable.
Dim area As Double
If length = 0 Or width = 0 Then
' If either argument = 0 then exit Sub immediately.
Exit Sub
End If
' Calculate area of rectangle.
area = length * width
' Print area to Immediate window.
Debug.WriteLine(area)
End Sub
Ejemplo 2
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 declaración de DelayAsync función de debe tener un tipo de valor devuelto de Task(Of Integer) . Dado que el tipo de valor devuelto es , la evaluación de la expresión en genera un entero, como se muestra Task(Of Integer) en la instrucción Await DoSomethingAsync siguiente: 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