Istruzione Sub (Visual Basic)

Dichiara il nome, i parametri e il codice che definiscono una Sub routine.

Sintassi

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

Parti

  • attributelist

    Facoltativa. Vedere Elenco attributi.

  • Partial

    Facoltativa. Indica la definizione di un metodo parziale. Vedere Metodi parziali.

  • accessmodifier

    Facoltativa. Può essere uno dei valori seguenti:

    Vedere Livelli di accesso in Visual Basic.

  • proceduremodifiers

    Facoltativa. Può essere uno dei valori seguenti:

  • Shared

    Facoltativa. Vedere Condiviso.

  • Shadows

    Facoltativa. Vedi Ombreggiature.

  • Async

    Facoltativa. Vedere Async.

  • name

    Obbligatorio. Nome della procedura. Vedere Declared Element Names. Per creare una routine del costruttore per una classe, impostare il nome di una Sub routine sulla New parola chiave . Per altre informazioni, vedere Durata degli oggetti: Modalità di creazione e eliminazione definitiva degli oggetti.

  • typeparamlist

    Facoltativa. Elenco di parametri di tipo per una routine generica. Vedere Elenco dei tipi.

  • parameterlist

    Facoltativa. Elenco di nomi di variabili locali che rappresentano i parametri di questa procedura. Vedere Elenco di parametri.

  • Implements

    Facoltativa. Indica che questa procedura implementa una o più Sub routine, ognuna definita in un'interfaccia implementata dalla classe o dalla struttura contenitore di questa routine. Vedere L'istruzione Implements.

  • implementslist

    Necessario se si fornisce Implements. Elenco delle routine Sub implementate.

    implementedprocedure [ , implementedprocedure ... ]

    Ogni implementedprocedure presenta la sintassi e le parti seguenti:

    interface.definedname

    Parte Descrizione
    interface Obbligatorio. Nome di un'interfaccia implementata da questa routine contenente la classe o la struttura.
    definedname Obbligatorio. Nome mediante il quale la routine viene definita in interface.
  • Handles

    Facoltativa. Indica che questa procedura può gestire uno o più eventi specifici. Vedere Handle.

  • eventlist

    Necessario se si fornisce Handles. Elenco di eventi gestiti da questa routine.

    eventspecifier [ , eventspecifier ... ]

    Ogni eventspecifier presenta la sintassi e le parti seguenti:

    eventvariable.event

    Parte Descrizione
    eventvariable Obbligatorio. Variabile oggetto dichiarata con il tipo di dati della classe o della struttura che genera l'evento.
    event Obbligatorio. Nome dell'evento gestito dalla routine.
  • statements

    Facoltativa. Blocco di istruzioni da eseguire all'interno di questa procedura.

  • End Sub

    Termina la definizione di questa procedura.

Commenti

Tutto il codice eseguibile deve trovarsi all'interno di una routine. Usare una Sub procedura quando non si vuole restituire un valore al codice chiamante. Utilizzare una Function procedura quando si desidera restituire un valore.

Definizione di una routine secondaria

È possibile definire una Sub routine solo a livello di modulo. Il contesto di dichiarazione per una routine secondaria 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. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Sub procedure predefinite per l'accesso pubblico. È possibile regolare i livelli di accesso usando i modificatori di accesso.

Se la routine utilizza la Implements parola chiave , la classe o la struttura contenitore deve avere un'istruzione Implements che segue immediatamente l'istruzione Class o Structure . L'istruzione Implements deve includere ogni interfaccia specificata in implementslist. Tuttavia, il nome in base al quale un'interfaccia definisce ( Sub in definedname) non deve corrispondere al nome di questa procedura (in name).

Restituzione da una routine secondaria

Quando una Sub routine torna al codice chiamante, l'esecuzione continua con l'istruzione dopo l'istruzione che lo ha chiamato.

Nell'esempio seguente viene illustrato un ritorno da una Sub routine.

Sub mySub(ByVal q As String)
    Return
End Sub

Le Exit Sub istruzioni e Return causano un'uscita immediata da una Sub routine. Qualsiasi numero di Exit Sub istruzioni e Return può essere visualizzato in qualsiasi punto della routine ed è possibile combinare Exit Sub istruzioni e Return .

Chiamata di una routine secondaria

Chiamare una Sub routine usando il nome della routine in un'istruzione e quindi seguendo tale nome con il relativo elenco di argomenti tra parentesi. È possibile omettere le parentesi solo se non si specificano argomenti. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.

Una Sub routine e una Function routine possono avere parametri ed eseguire una serie di istruzioni. Tuttavia, una Function routine restituisce un valore e una Sub routine non lo fa. Pertanto, non è possibile usare una Sub routine in un'espressione.

È possibile usare la Call parola chiave quando si chiama una Sub routine, ma tale parola chiave non è consigliata per la maggior parte degli usi. Per altre informazioni, vedere Istruzione call.

Visual Basic a volte riorganizzerà le espressioni aritmetiche per aumentare l'efficienza interna. Per questo motivo, se l'elenco di argomenti include espressioni che chiamano altre procedure, non è consigliabile presupporre che tali espressioni vengano chiamate in un ordine specifico.

Sotto procedure asincrone

Usando la funzionalità Async, è possibile richiamare funzioni asincrone senza usare callback espliciti o suddividere manualmente il codice tra più funzioni o espressioni lambda.

Se si contrassegna una procedura con il modificatore Async , è possibile usare l'operatore Await nella procedura. Quando il controllo raggiunge un'espressione Await nella Async procedura, il controllo restituisce al chiamante e lo stato della procedura viene sospeso fino al completamento dell'attività attesa. Al termine dell'attività, l'esecuzione può riprendere nella procedura.

Nota

Una Async routine restituisce al chiamante quando viene rilevato il primo oggetto atteso non ancora completato o la fine della Async procedura viene raggiunta, che si verifica prima.

È anche possibile contrassegnare un'istruzione funzione con il Async modificatore. Una Async funzione può avere un tipo restituito di Task<TResult> o Task. Un esempio più avanti in questo argomento mostra una Async funzione con un tipo restituito di Task<TResult>.

AsyncSub le procedure vengono usate principalmente per i gestori eventi, in cui non è possibile restituire un valore. Non è possibile attendere una AsyncSub procedura e il chiamante di una AsyncSub routine non può rilevare eccezioni generate dalla Sub procedura.

Una Async routine non può dichiarare parametri ByRef .

Per altre informazioni sulle Async procedure, vedere Programmazione asincrona con Async e Await, Flusso di controllo nei programmi asincroni e Tipi restituiti asincroni.

Esempio 1

Nell'esempio seguente viene usata l'istruzione Sub per definire il nome, i parametri e il codice che formano il corpo di una Sub routine.

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

Esempio 2

Nell'esempio seguente è DelayAsync un oggetto AsyncFunction con un tipo restituito di Task<TResult>. DelayAsync ha un'istruzione Return che restituisce un numero intero. Pertanto, la dichiarazione di funzione di DelayAsync deve avere un tipo restituito di Task(Of Integer). Poiché il tipo restituito è Task(Of Integer), la valutazione dell'espressione in DoSomethingAsync produce un intero, come illustrato nell'istruzione Await seguente: Dim result As Integer = Await delayTask.

La startButton_Click procedura è un esempio di Async Sub una routine. Poiché DoSomethingAsync è una Async funzione, l'attività da DoSomethingAsync attendere per la chiamata deve essere attesa, come illustrato nell'istruzione seguente: Await DoSomethingAsync(). La startButton_Clickprocedura deve essere definita con il modificatore perché ha un'espressione AsyncAwait.Sub

' 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

Vedi anche