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

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

SintaxisSyntax

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

ElementosParts

  • attributelist

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

  • Partial

    Opcional.Optional. Indica la definición de un método parcial.Indicates definition of a partial method. Vea métodos parciales.See Partial Methods.

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

  • name

    Obligatorio.Required. Nombre del procedimiento.Name of the procedure. Vea Declared Element Names.See Declared Element Names. Para crear un procedimiento de constructor para una clase, establezca el nombre de una Sub procedimiento en la palabra clave New.To create a constructor procedure for a class, set the name of a Sub procedure to the New keyword. Para obtener más información, vea duración del objeto: cómo se crean y destruyen los objetos.For more information, see Object Lifetime: How Objects Are Created and Destroyed.

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

  • Implements

    Opcional.Optional. Indica que este procedimiento implementa uno o varios procedimientos de Sub, 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 Sub 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 Sub que se implementan.List of Sub 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 Obligatorio.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 Obligatorio.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 Obligatorio.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 Obligatorio.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 dentro de este procedimiento.Block of statements to run within this procedure.

  • End Sub

    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. Use un procedimiento Sub cuando no desee devolver un valor al código de llamada.Use a Sub procedure when you don't want to return a value to the calling code. Use una Function procedimiento cuando desee devolver un valor.Use a Function procedure when you want to return a value.

Definir un procedimiento SubDefining a Sub Procedure

Solo puede definir un procedimiento Sub en el nivel de módulo.You can define a Sub procedure only at the module level. 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.The declaration context for a sub procedure must, therefore, 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.

Sub procedimientos tienen como valor predeterminado el acceso público.Sub procedures default to public access. Puede ajustar sus niveles de acceso mediante los modificadores de acceso.You can adjust their access levels by using the access modifiers.

Si el procedimiento usa la palabra clave Implements, la clase o estructura contenedora debe tener una instrucción Implements que siga inmediatamente a su instrucción Class o Structure.If the procedure uses the Implements keyword, the containing class or structure must 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 Sub (en definedname) no tiene que coincidir con el nombre de este procedimiento (en name).However, the name by which an interface defines the Sub (in definedname) doesn't have to match the name of this procedure (in name).

Devolver desde un procedimiento SubReturning from a Sub Procedure

Cuando un procedimiento Sub devuelve al código de llamada, la ejecución continúa con la instrucción después de la instrucción que lo llamó.When a Sub procedure returns to the calling code, execution continues with the statement after the statement that called it.

En el ejemplo siguiente se muestra un valor devuelto de un procedimiento Sub.The following example shows a return from a Sub procedure.

Sub mySub(ByVal q As String)
    Return
End Sub

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

Llamar a un procedimiento SubCalling a Sub Procedure

Llame a un procedimiento de Sub mediante el nombre del procedimiento en una instrucción y, a continuación, siga ese nombre con su lista de argumentos entre paréntesis.You call a Sub procedure by using the procedure name in a statement and then following that name with its argument list in parentheses. Solo se pueden omitir los paréntesis si no se proporcionan argumentos.You can omit the parentheses only if you don't supply 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.

Un procedimiento de Sub y un procedimiento Function pueden tener parámetros y realizar una serie de instrucciones.A Sub procedure and a Function procedure can have parameters and perform a series of statements. Sin embargo, un procedimiento Function devuelve un valor y un procedimiento Sub no.However, a Function procedure returns a value, and a Sub procedure doesn't. Por lo tanto, no se puede usar un procedimiento Sub en una expresión.Therefore, you can't use a Sub procedure in an expression.

Puede usar la palabra clave Call al llamar a un procedimiento de Sub, pero esa palabra clave no se recomienda para la mayoría de los usos.You can use the Call keyword when you call a Sub procedure, but that keyword isn't recommended for most uses. 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, 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.For that reason, if your argument list includes expressions that call other procedures, you shouldn't assume that those expressions will be called in a particular order.

Procedimientos sub asincrónicosAsync Sub Procedures

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.By using the Async feature, you can invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

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

Nota

Un procedimiento Async 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 procedimiento Async, lo que ocurra primero.An Async procedure returns to the caller when either the first awaited object that’s not yet complete is encountered or the end of the Async procedure is reached, whichever occurs first.

También puede marcar una instrucción de función con el modificador Async.You can also mark a Function Statement with the Async modifier. 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. Un ejemplo más adelante en este tema muestra una función Async que tiene un tipo de valor devuelto de Task<TResult>.An example later in this topic shows an Async function that has a return type of Task<TResult>.

Async Sub procedimientos se utilizan principalmente para los controladores de eventos, donde no se puede devolver un valor.Async Sub procedures are primarily used for event handlers, where a value can't 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 que produce el procedimiento Sub.An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that the Sub procedure throws.

Un procedimiento Async no puede declarar ningún parámetro ByRef .An Async procedure can't declare any ByRef parameters.

Para obtener más información sobre los procedimientos 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 procedures, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

EjemploExample

En el ejemplo siguiente se usa la instrucción Sub para definir el nombre, los parámetros y el código que forman el cuerpo de un procedimiento Sub.The following example uses the Sub statement to define the name, parameters, and code that form the body of a Sub procedure.

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

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 must 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 genera un entero, como se muestra en la siguiente instrucción: Dim result As Integer = Await delayTask.Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer, as the following statement shows: 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 shows: 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