Sub (Instrucción, Visual Basic)

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

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

Elementos

Término

Definición

attributelist

Opcional. Vea la Lista de atributos.

Partial

Opcional. Indica la definición de un método parcial. Vea Métodos parciales (Visual Basic).

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.

name

Requerido. Nombre del procedimiento. Vea Nombres de elementos declarados (Visual Basic). Para crear un procedimiento de constructor para una clase, establezca el nombre de un procedimiento Sub en la palabra clave New. Para obtener más información, vea Duración de los objetos: cómo se crean y destruyen (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).

Implements

Opcional. Indica que este procedimiento implementa uno o más procedimientos Sub, 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 Sub 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 ejecuta dentro de este procedimiento.

End Sub

Termina la definición de este procedimiento.

Comentarios

El código ejecutable debe estar en un procedimiento. Utilice un procedimiento Sub cuando no desea devolver un valor. Utilice un procedimiento Function cuando se desea devolver un valor.

Definición de un procedimiento Sub

Puede definir un procedimiento Sub sólo en el nivel de módulo. El contexto de declaración para un procedimiento sub debe, por consiguiente, 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 Sub tienen como valor predeterminado el acceso público. Puede ajustar los niveles de acceso mediante los modificadores de acceso.

Si el 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 Sub (en definedname) no tiene que coincidir con el nombre de este procedimiento (en name).

El cambio de un procedimiento Sub

Cuando un procedimiento Sub 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 cómo volver de un procedimiento Sub.

Sub mySub(ByVal q As String)
    Return
End Sub 

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

Llamar a un procedimiento Sub

Se llama a un procedimiento Sub utilizando el nombre de procedimiento en una instrucción y después después de ese nombre con la lista de argumentos entre paréntesis. 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.

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

Puede utilizar la palabra clave Call cuando se llama a un procedimiento Sub , pero la palabra clave no se recomienda para la mayoría utiliza. 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 esta razón, si la lista de argumentos incluye expresiones que llaman otros procedimientos, no debe suponer que las expresiones se llame en un orden determinado.

Procedimientos del método Async

Mediante la característica de Async, puede 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 un procedimiento con el modificador Async , puede utilizar el operador Espera en el procedimiento. Cuando el control alcanza una expresión Await en el procedimiento Async , el control vuelve al llamador, y el progreso en el procedimiento se suspende hasta que la tarea aguardada complete. Cuando finaliza la tarea, la ejecución se puede reanudar en el procedimiento.

Nota

Un procedimiento Async vuelve al llamador cuando tanto el primer aguardó se encuentra el objeto que aún no se completa o el final del procedimiento Async se logra, lo que ocurre primero.

También puede marcar Function (Instrucción, Visual Basic) con el modificador Async . Una función Async puede tener un tipo de valor devuelto Task o Task. Un ejemplo que figura más adelante en este tema una función Async que tenga un tipo de valor devuelto Task.

Los procedimientos deAsyncSub se utilizan 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 que el procedimiento Sub produce.

Un procedimiento Async no puede declarar los parámetros ByRef .

Para obtener más información sobre los procedimientos 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).

Ejemplo

En este ejemplo se utiliza la instrucción Sub para definir el nombre, parámetros y código que forman el cuerpo de un procedimiento Sub.

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

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 debe 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, como la instrucción siguiente muestra: 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

Implements (Instrucción)

Function (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)

Conceptos

Matrices de parámetros (Visual Basic)

Métodos parciales (Visual Basic)