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

  • attributelist

    Opcional. Vea lista de atributos.

  • Partial

    Opcional. Indica la definición de un método parcial. Vea métodos parciales.

  • 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 Shared.

  • Shadows

    Opcional. Vea Shadows.

  • Async

    Opcional. Vea Async.

  • name

    Necesario. Nombre del procedimiento. Vea Declared Element Names. Para crear un procedimiento de constructor para una clase, establezca el nombre de un Sub procedimiento en la New palabra clave. Para obtener más información, vea duración del objeto: cómo se crean y destruyen los objetos.

  • typeparamlist

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

  • parameterlist

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

  • Implements

    Opcional. Indica que este procedimiento implementa uno o más Sub procedimientos, cada uno de ellos definido en una interfaz implementada por la clase o estructura contenedora de este procedimiento. Vea Implements (instrucción).

  • implementslist

    Es necesario si se proporciona Implements. Lista de procedimientos Sub 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 contenedora de este procedimiento.
    definedname Necesario. Nombre por el que se define el procedimiento en interface.
  • Handles

    Opcional. Indica que este procedimiento puede controlar uno o más eventos concretos. 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 Sub

    Finaliza la definición de este procedimiento.

Observaciones

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.

Definir un procedimiento Sub

Solo puede definir un Sub procedimiento en el nivel de módulo. El contexto de la declaración para un procedimiento Sub debe, por tanto, 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 Implements palabra clave, la clase contenedora o la estructura deben tener una Implements instrucción que siga inmediatamente a su Class Structure instrucción o. La Implements instrucción debe incluir cada interfaz especificada en implementslist . Sin embargo, el nombre por el que una interfaz define Sub (en definedname ) no tiene que coincidir con el nombre de este procedimiento (en name ).

Devolver desde un procedimiento Sub

Cuando un Sub procedimiento vuelve al código de llamada, la ejecución continúa con la instrucción después de la instrucción que lo llamó.

En el ejemplo siguiente se muestra un valor devuelto de un Sub procedimiento.

Sub mySub(ByVal q As String)
    Return
End Sub

Las Exit Sub Return instrucciones y producen una salida inmediata de un Sub procedimiento. Cualquier número de Exit Sub Return instrucciones y puede aparecer en cualquier parte del procedimiento y se pueden mezclar Exit Sub e Return instrucciones.

Llamar a un procedimiento Sub

Llame a un Sub procedimiento mediante el nombre del procedimiento en una instrucción y, a continuación, siga ese nombre con su lista de argumentos entre paréntesis. Solo se pueden omitir los paréntesis si no se proporcionan argumentos. Sin embargo, el código es más legible si siempre incluye los paréntesis.

Un Sub procedimiento y un Function procedimiento pueden tener parámetros y realizar una serie de instrucciones. Sin embargo, un Function procedimiento devuelve un valor y un Sub procedimiento no. Por lo tanto, no se puede usar un Sub procedimiento en una expresión.

Puede usar la Call palabra clave al llamar a un Sub procedimiento, pero esa palabra clave no se recomienda para la mayoría de los usos. Para obtener más información, consulte instrucción call.

A veces Visual Basic 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 asumir que se llamará a esas expresiones en un orden determinado.

Procedimientos sub 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 en 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 Await expresión en el Async procedimiento, el control vuelve al autor de la llamada y el progreso en el procedimiento se suspende hasta que se completa la tarea esperada. Una vez completada la tarea, la ejecución puede reanudarse en el procedimiento.

Nota

Un Async procedimiento vuelve al llamador cuando se encuentra el primer objeto esperado que aún no se ha completado o hasta que se alcanza el final del Async procedimiento, lo que suceda primero.

También puede marcar una instrucción function con el Async modificador. Una Async función puede tener un tipo de valor devuelto de Task<TResult> o 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 utilizan principalmente para los controladores de eventos, donde no se puede devolver un valor. Async Sub No se puede esperar a un procedimiento y el autor de la llamada de un Async Sub procedimiento no puede detectar las excepciones que Sub inicia el procedimiento.

Un Async procedimiento no puede declarar ningún parámetro ByRef .

Para obtener más información sobre Async los procedimientos, consulte programación asincrónica con Async y Await, flujo de control en programas asincrónicosy tipos de valor devueltos asincrónicos.

Ejemplo

En el ejemplo siguiente se usa la Sub instrucción para definir el nombre, los parámetros y el 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

En el ejemplo siguiente, DelayAsync es un Async Function que tiene un tipo de valor devuelto de Task<TResult> . DelayAsync tiene una instrucción Return que devuelve un entero. Por consiguiente, la declaración de función de DelayAsync 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 Await expresión en DoSomethingAsync genera un entero, como se muestra en la siguiente instrucción: Dim result As Integer = Await delayTask .

El startButton_Click procedimiento es un ejemplo de un Async Sub procedimiento. Dado DoSomethingAsync que es una Async función, se debe esperar a la tarea de la llamada a DoSomethingAsync , como se muestra en la siguiente 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

Vea también