Istruzione Sub (Visual Basic)
Dichiara il nome, i parametri e il codice che definiscono una routine Sub
.
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
Facoltativo. Vedere Elenco degli attributi.
Partial
Facoltativo. Indica la definizione di un metodo parziale. Vedere metodi parziali.
accessmodifier
Facoltativo. Può essere uno dei seguenti:
Vedere Access levels in Visual Basic.
proceduremodifiers
Facoltativo. Può essere uno dei seguenti:
MustOverride Overrides
NotOverridable Overrides
Shared
Facoltativo. Vedere Shared.
Shadows
Facoltativo. Vedere Shadows.
Async
Facoltativo. Vedere Async.
name
Obbligatorio. Nome della routine. Vedere Declared Element Names. Per creare una routine del costruttore per una classe, impostare il nome di una routine
Sub
sulla parola chiaveNew
. Per altre informazioni, vedere Durata dell'oggetto: creazione ed eliminazione definitiva degli oggetti.typeparamlist
Facoltativo. Elenco dei parametri di tipo (per una routine generica). Vedere Elenco tipi.
parameterlist
Facoltativo. Elenco di nomi di variabili locali che rappresentano i parametri di questa routine. Vedere Elenco parametri.
Implements
Facoltativo. Indica che questa procedura implementa una o più routine
Sub
, ognuna definita in un'interfaccia implementata dalla classe o dalla struttura contenitore di questa routine. Vedere 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
In 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
Facoltativo. Indica che questa routine 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
In 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 da questa routine. statements
Facoltativo. Blocco di istruzioni da eseguire all'interno di questa routine.
End Sub
Termina la definizione di questa routine.
Osservazioni:
Tutto il codice eseguibile deve trovarsi all'interno di una routine. Usare una routine Sub
quando non si vuole restituire un valore al codice chiamante. Utilizzare una routine Function
quando si desidera restituire un valore.
Definizione di una routine secondaria
È possibile definire una routine Sub
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.
Routine Sub
predefinite per l'accesso pubblico. È possibile regolare i livelli di accesso usando i modificatori di accesso.
Se la routine usa la parola chiave Implements
, la classe o la struttura contenitore deve avere un'istruzione Implements
che segue immediatamente la relativa 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 routine (in name
).
Restituzione da una routine secondaria
Quando una routine Sub
torna al codice chiamante, l'esecuzione continua con l'istruzione che segue l'istruzione che lo ha chiamato.
Nell'esempio seguente viene illustrato un risultato restituito da una routine Sub
.
Sub mySub(ByVal q As String)
Return
End Sub
Le istruzioni Exit Sub
e Return
causano un'uscita immediata da una routine Sub
. Qualsiasi numero di istruzioni Exit Sub
e Return
può essere visualizzato in qualsiasi punto della routine, ed è possibile combinare le istruzioni Exit Sub
e Return
.
Chiamata di una routine secondaria
Chiamare una routine Sub
utilizzando 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 degli argomenti. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.
Una routine Sub
e una routine Function
possono avere dei parametri ed eseguire una serie di istruzioni. Tuttavia, una routine Function
restituisce un valore, mentre una routine Sub
non lo fa. Pertanto, non è possibile usare una routine Sub
in un'espressione.
È possibile usare la parola chiave Call
quando si chiama una routine Sub
, ma questa parola chiave non è consigliata per la maggior parte degli usi. Per altre informazioni, vedere Istruzione call.
Visual Basic talvolta riorganizzerà le espressioni aritmetiche per aumentare l'efficienza interna. Per questo motivo, se l'elenco di argomenti include espressioni che chiamano altre routine, non è consigliabile presupporre che tali espressioni vengano chiamate in un ordine specifico.
Routine secondarie asincrone
Tramite la funzionalità async, è possibile richiamare le funzionalità asincroni senza usare callback espliciti o suddividere manualmente il codice in più funzionalità o espressioni lambda.
Se si contrassegna una routine con il modificatore async, è possibile usare l'operatore await nella routine. Quando il controllo raggiunge un'espressione Await
nella routine Async
, il controllo torna al chiamante e lo stato della routine viene sospeso fino al completamento dell'attività attesa. Una volta completata l'attività, l'esecuzione della routine può riprendere.
Nota
Una routine Async
torna al chiamante quando viene raggiunto il primo oggetto atteso che non è ancora stato completato o quando viene raggiunta la fine della routine Async
, a seconda di quale si verifica per prima.
È anche possibile contrassegnare una Istruzione Function con il modificatore Async
. Una funzione Async
può avere un tipo restituito di Task<TResult> o Task. Un esempio più avanti in questo argomento illustra una funzione Async
con un tipo restituito di Task<TResult>.
Le routine Sub
Async
vengono usate principalmente per i gestori eventi, in cui non è possibile restituire un valore. Non è possibile attendere una routine Sub
Async
e il chiamante di una routine Sub
Async
non può intercettare le eccezioni generate dalla routine Sub
.
Una routine Async
non può dichiarare parametri ByRef.
Per altre informazioni sulle routine di Async
, vedere Programmazione asincrona con Async e Await, Flusso di controllo in Programmi asincroni e Tipi restituiti asincroni.
Esempio 1
Nell'esempio seguente viene utilizzata l'istruzione Sub
per definire il nome, i parametri e il codice che formano il corpo di una routine 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
Esempio 2
Nell'esempio seguente, DelayAsync
è un elemento Function
Async
con tipo restituito Task<TResult>. DelayAsync
ha un'istruzione Return
che restituisce un numero intero. La dichiarazione della funzione di DelayAsync
deve quindi avere un tipo restituito Task(Of Integer)
. Poiché il tipo restituito è Task(Of Integer)
, la valutazione dell'espressione Await
in DoSomethingAsync
genera un numero intero come mostra l'istruzione Dim result As Integer = Await delayTask
seguente.
La routine startButton_Click
è un esempio di routine Async Sub
. Poiché DoSomethingAsync
è una funzione Async
, deve essere attesa l'attività per la chiamata a DoSomethingAsync
, come illustrato nell'istruzione Await DoSomethingAsync()
seguente. È necessario definire la routine Sub
startButton_Click
con il modificatore Async
perché contiene un'espressione 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