Istruzione Sub (Visual Basic)Sub Statement (Visual Basic)

Dichiara il nome, parametri e il codice che definiscono un Sub procedure.Declares the name, parameters, and code that define a Sub procedure.

SintassiSyntax

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

PartiParts

  • attributelist

    Facoltativo.Optional. Visualizzare elenco attributi.See Attribute List.

  • Partial

    Facoltativo.Optional. Indica la definizione di un metodo parziale.Indicates definition of a partial method. Visualizzare metodi parziali.See Partial Methods.

  • accessmodifier

    Facoltativo.Optional. Può essere uno dei seguenti:Can be one of the following:

    Vedere Access levels in Visual Basic.See Access levels in Visual Basic.

  • proceduremodifiers

    Facoltativo.Optional. Può essere uno dei seguenti:Can be one of the following:

  • Shared

    Facoltativo.Optional. Visualizzare condiviso.See Shared.

  • Shadows

    Facoltativo.Optional. Visualizzare Shadows.See Shadows.

  • Async

    Facoltativo.Optional. Visualizzare Async.See Async.

  • name

    Obbligatorio.Required. Nome della procedura.Name of the procedure. Vedere Declared Element Names.See Declared Element Names. Per creare una routine di costruttore per una classe, impostare il nome di un Sub procedura per la New (parola chiave).To create a constructor procedure for a class, set the name of a Sub procedure to the New keyword. Per altre informazioni, vedere durata degli oggetti: Come gli oggetti vengono creati e distrutti.For more information, see Object Lifetime: How Objects Are Created and Destroyed.

  • typeparamlist

    Facoltativo.Optional. Elenco di parametri di tipo per una routine generica.List of type parameters for a generic procedure. Visualizzare elenco dei tipi.See Type List.

  • parameterlist

    Facoltativo.Optional. Elenco di nomi delle variabili locali che rappresentano i parametri di questa procedura.List of local variable names representing the parameters of this procedure. Visualizzare elenco di parametri.See Parameter List.

  • Implements

    Facoltativo.Optional. Indica che questa procedura consente di implementare uno o più Sub procedure, ciascuno definito in un'interfaccia implementata dalla classe o struttura che contiene questa procedura.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. Visualizzare implementa istruzione.See Implements Statement.

  • implementslist

    Necessario se si fornisce Implements.Required if Implements is supplied. Elenco delle routine Sub implementate.List of Sub procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    Ogni implementedprocedure presenta la sintassi e le parti seguenti:Each implementedprocedure has the following syntax and parts:

    interface.definedname

    PartePart DescrizioneDescription
    interface Obbligatorio.Required. Classe o struttura contenente nome di un'interfaccia implementata da questa procedura.Name of an interface implemented by this procedure's containing class or structure.
    definedname Obbligatorio.Required. Nome mediante il quale la routine viene definita in interface.Name by which the procedure is defined in interface.
  • Handles

    Facoltativo.Optional. Indica che questa procedura può gestire uno o più eventi specifici.Indicates that this procedure can handle one or more specific events. Visualizzare gestisce.See Handles.

  • eventlist

    Necessario se si fornisce Handles.Required if Handles is supplied. Elenco di eventi che gestisce questa procedura.List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    Ogni eventspecifier presenta la sintassi e le parti seguenti:Each eventspecifier has the following syntax and parts:

    eventvariable.event

    PartePart DescrizioneDescription
    eventvariable Obbligatorio.Required. Variabile oggetto dichiarata con il tipo di dati della classe o struttura che genera l'evento.Object variable declared with the data type of the class or structure that raises the event.
    event Obbligatorio.Required. Nome dell'evento gestito da questa routine.Name of the event this procedure handles.
  • statements

    Facoltativo.Optional. Blocco di istruzioni da eseguire all'interno di questa procedura.Block of statements to run within this procedure.

  • End Sub

    Termina la definizione di questa procedura.Terminates the definition of this procedure.

NoteRemarks

Tutto il codice eseguibile deve essere all'interno di una routine.All executable code must be inside a procedure. Usare un Sub procedure quando non si vuole restituire un valore al codice chiamante.Use a Sub procedure when you don't want to return a value to the calling code. Usare un Function procedure quando si vuole restituire un valore.Use a Function procedure when you want to return a value.

La definizione di una routine SubDefining a Sub Procedure

È possibile definire un Sub procedure solo a livello di modulo.You can define a Sub procedure only at the module level. Il contesto della dichiarazione per una routine sub deve, pertanto, essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di origine, uno spazio dei nomi, una routine o un blocco.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. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.For more information, see Declaration Contexts and Default Access Levels.

Sub Per impostazione predefinita le procedure per l'accesso pubblico.Sub procedures default to public access. È possibile modificare i livelli di accesso usando i modificatori di accesso.You can adjust their access levels by using the access modifiers.

Se la procedura Usa il Implements parola chiave, alla classe o struttura deve avere un Implements istruzione che segue immediatamente relativo Class o Structure istruzione.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. Il Implements istruzione deve includere ogni interfaccia specificata in implementslist.The Implements statement must include each interface that's specified in implementslist. Tuttavia, il nome mediante il quale definisce un'interfaccia di Sub (in definedname) non deve necessariamente corrispondere al nome di questa procedura (in 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).

Restituzione da una routine SubReturning from a Sub Procedure

Quando un Sub routine restituisce al codice chiamante, l'esecuzione continua con l'istruzione successiva all'istruzione che lo ha chiamato.When a Sub procedure returns to the calling code, execution continues with the statement after the statement that called it.

Nell'esempio seguente viene illustrata la restituzione da una Sub procedure.The following example shows a return from a Sub procedure.

Sub mySub(ByVal q As String)
    Return
End Sub

Il Exit Sub e Return istruzioni uscire immediatamente da un Sub procedure.The Exit Sub and Return statements cause an immediate exit from a Sub procedure. Un numero qualsiasi di Exit Sub e Return istruzioni possono trovarsi in qualsiasi punto della procedura, ed è possibile combinare Exit Sub e Return istruzioni.Any number of Exit Sub and Return statements can appear anywhere in the procedure, and you can mix Exit Sub and Return statements.

Chiamare una routine SubCalling a Sub Procedure

Si chiama un Sub procedura usando il nome della routine in un'istruzione e quindi seguire tale nome con il relativo elenco di argomenti racchiuso tra parentesi.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 non si fornisce alcun argomento, è possibile omettere le parentesi.You can omit the parentheses only if you don't supply any arguments. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.However, your code is more readable if you always include the parentheses.

Oggetto Sub procedure e un Function procedura può avere parametri ed eseguire una serie di istruzioni.A Sub procedure and a Function procedure can have parameters and perform a series of statements. Tuttavia, un Function routine restituisce un valore e un Sub non di procedura.However, a Function procedure returns a value, and a Sub procedure doesn't. Pertanto, è possibile utilizzare un Sub procedure in un'espressione.Therefore, you can't use a Sub procedure in an expression.

È possibile usare la Call parola chiave quando si chiama un Sub routine, ma tale parola chiave non è consigliato per la maggior parte degli utilizzi.You can use the Call keyword when you call a Sub procedure, but that keyword isn't recommended for most uses. Per altre informazioni, vedere istruzione Call.For more information, see Call Statement.

In alcuni casi, Visual Basic ridispone espressioni aritmetiche per aumentare l'efficienza interno.Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. Per questo motivo, se all'elenco di argomenti sono incluse le espressioni che chiamano altre procedure, si dovrebbero evitare supposizioni che verranno chiamate tali espressioni in un ordine particolare.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.

Routine Sub AsyncAsync Sub Procedures

Usando la funzionalità Async, è possibile richiamare le funzioni asincrone senza usare callback espliciti o suddividere manualmente il codice in più funzioni o espressioni 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.

Se si contrassegna una procedura con il Async modificatore, è possibile utilizzare il Await operatore nella procedura.If you mark a procedure with the Async modifier, you can use the Await operator in the procedure. Quando il controllo raggiunge un' Await espressione nel Async procedure, il controllo ritorna al chiamante e lo stato di avanzamento della procedura viene sospeso fino al completamento dell'attività attesa.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 volta completata l'attività, l'esecuzione può riprendere la procedura.When the task is complete, execution can resume in the procedure.

Nota

Un' Async routine restituisce al chiamante quando viene rilevato un il primo oggetto atteso che non è ancora completo o alla fine del Async procedure viene raggiunta, qualunque si verifichi prima.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.

È inoltre possibile contrassegnare un istruzione Function con il Async modificatore.You can also mark a Function Statement with the Async modifier. Un' Async funzione può avere un tipo restituito Task<TResult> o Task.An Async function can have a return type of Task<TResult> or Task. Un esempio più avanti in questo argomento viene illustrato un Async che presenta un tipo restituito della funzione Task<TResult>.An example later in this topic shows an Async function that has a return type of Task<TResult>.

Async Sub le procedure vengono utilizzate principalmente per i gestori eventi, in cui non è possibile restituire un valore.Async Sub procedures are primarily used for event handlers, where a value can't be returned. Un' Async Sub routine non può essere atteso e il chiamante di un Async Sub procedure non può intercettare le eccezioni che il Sub routine genera un'eccezione.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' Async routine non può dichiarare ByRef parametri.An Async procedure can't declare any ByRef parameters.

Per altre informazioni sulle Async procedure, vedere programmazione asincrona con Async e Await, flusso di controllo in programmi asincroni, e tipi restituiti asincroni.For more information about Async procedures, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

EsempioExample

L'esempio seguente usa il Sub istruzione per definire il nome, parametri e codice che costituiscono il corpo di un Sub procedure.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

EsempioExample

Nell'esempio riportato di seguito DelayAsync è un Async Function che ha un tipo restituito di Task<TResult>.In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync ha un'istruzione Return che restituisce un numero intero.DelayAsync has a Return statement that returns an integer. Pertanto, la dichiarazione della funzione di DelayAsync deve presentare un tipo restituito di Task(Of Integer).Therefore, the function declaration of DelayAsync must have a return type of Task(Of Integer). Poiché il tipo restituito è Task(Of Integer), la valutazione del Await espressione nella DoSomethingAsync genera un numero intero, come illustrato nell'istruzione seguente: 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.

Il startButton_Click procedure è un esempio di un Async Sub procedure.The startButton_Click procedure is an example of an Async Sub procedure. In quanto DoSomethingAsync è un Async (funzione), l'attività per la chiamata a DoSomethingAsync deve essere attesa, come illustrato nell'istruzione seguente: 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(). Il startButton_Click Sub procedura deve essere definita con la Async modificatore perché contiene un Await espressione.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

Vedere ancheSee also