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:
proceduremodifiers
Facoltativa. Può essere uno dei valori seguenti:
MustOverride Overrides
NotOverridable Overrides
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 sullaNew
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 routineSub
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>.
Async
Sub
le procedure vengono usate principalmente per i gestori eventi, in cui non è possibile restituire un valore. Non è possibile attendere una Async
Sub
procedura e il chiamante di una Async
Sub
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 Async
Function
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_Click
procedura deve essere definita con il modificatore perché ha un'espressione Async
Await
.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