Sub, instruction (Visual Basic)
Déclare le nom, les paramètres et le code qui définissent une procédure Sub
.
Syntaxe
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub
Éléments
attributelist
Optionnel. Consultez la Liste des attributs.
Partial
Optionnel. Indique la définition d’une méthode partielle. Voir les méthodes partielles.
accessmodifier
Optionnel. Il peut s'agir d'une des méthodes suivantes :
Consultez Access levels in Visual Basic.
proceduremodifiers
Optionnel. Il peut s'agir d'une des méthodes suivantes :
MustOverride Overrides
NotOverridable Overrides
Shared
Optionnel. Consultez Partagé.
Shadows
Optionnel. Consultez Shadows.
Async
Optionnel. Voir Async.
name
Obligatoire. Nom de la procédure. Consultez Declared Element Names. Pour créer une procédure de constructeur pour une classe, définissez le nom d’une procédure
Sub
sur le mot cléNew
. Pour plus d’informations, consultez Durée de vie d’un objet : création et destruction des objets.typeparamlist
Optionnel. Liste des paramètres de type pour une procédure générique. Consultez Liste de types.
parameterlist
Optionnel. Liste des noms de variables locales représentant les paramètres de cette procédure. Consultez la Liste des paramètres.
Implements
Optionnel. Indique que cette procédure implémente une ou plusieurs procédures
Sub
, chacune définie dans une interface implémentée par la classe ou la structure contenant cette procédure. Consultez Instruction Implements.implementslist
Obligatoire si
Implements
est utilisé. Liste des procéduresSub
en cours d'implémentation.implementedprocedure [ , implementedprocedure ... ]
Chaque
implementedprocedure
emploie la syntaxe et les éléments suivants :interface.definedname
Élément Description interface
Obligatoire. Nom d’une interface implémentée par la classe ou la structure contenant cette procédure. definedname
Obligatoire. Nom par lequel la procédure est définie dans interface
.Handles
Optionnel. Indique que cette procédure peut gérer un ou plusieurs événements spécifiques. Voir Handles.
eventlist
Obligatoire si
Handles
est utilisé. Liste des événements gérés par cette procédure.eventspecifier [ , eventspecifier ... ]
Chaque
eventspecifier
emploie la syntaxe et les éléments suivants :eventvariable.event
Élément Description eventvariable
Obligatoire. Variable objet déclarée avec le type de données de la classe ou de la structure qui déclenche l’événement. event
Obligatoire. Nom de l’événement géré par cette procédure. statements
Optionnel. Bloc d’instructions à exécuter dans cette procédure.
End Sub
Met fin à la définition de cette procédure.
Notes
Tout le code exécutable doit se trouver à l’intérieur d’une procédure. Utilisez une procédure Sub
lorsque vous ne souhaitez pas retourner de valeur au code appelant. Utilisez une procédure Function
lorsque vous souhaitez retourner une valeur.
Définition d’une sous-procédure
Vous pouvez définir une procédure Sub
uniquement au niveau du module. Le contexte de déclaration d’une sous-procédure doit donc être une classe, une structure, un module ou une interface et ne peut pas être un fichier source, un espace de noms, une procédure ou un bloc. Pour plus d’informations, consultez Contextes de déclaration et niveaux d’accès par défaut.
Procédures Sub
par défaut pour l’accès public. Vous pouvez ajuster leurs niveaux d’accès à l’aide des modificateurs d’accès.
Si la procédure utilise le mot clé Implements
, la classe ou la structure conteneur doit avoir une instruction Implements
qui suit immédiatement son instruction Class
ou Structure
. L’instruction Implements
doit inclure chaque interface spécifiée dans implementslist
. Toutefois, le nom par lequel une interface définit le Sub
(dans definedname
) n’a pas besoin de correspondre au nom de cette procédure (dans name
).
Retour d’une sous-procédure
Lorsqu’une procédure Sub
retourne au code appelant, l’exécution continue avec l’instruction après l’instruction qui l’a appelée.
L’exemple suivant montre un retour d’une procédure Sub
.
Sub mySub(ByVal q As String)
Return
End Sub
Les instructions Exit Sub
et Return
provoquent une sortie immédiate d’une procédure Sub
. N’importe quel nombre d’instructions Exit Sub
et Return
peuvent apparaître n’importe où dans la procédure, et vous pouvez combiner des instructions Exit Sub
et Return
.
Appel d’une sous-procédure
Vous appelez une procédure Sub
en utilisant le nom de la procédure dans une instruction, puis en suivant ce nom avec sa liste d’arguments entre parenthèses. Vous ne pouvez omettre les parenthèses que si vous ne fournissez aucun argument. Toutefois, votre code est plus lisible si vous incluez toujours les parenthèses.
Une procédure Sub
et une procédure Function
peuvent avoir des paramètres et effectuer une série d’instructions. Toutefois, une procédure Function
retourne une valeur et une procédure Sub
ne le fait pas. Par conséquent, vous ne pouvez pas utiliser de procédure Sub
dans une expression.
Vous pouvez utiliser le mot clé Call
lorsque vous appelez une procédure Sub
, mais ce mot clé n’est pas recommandé pour la plupart des utilisations. Pour plus d’informations, consultez Instruction Call.
Visual Basic réorganise parfois les expressions arithmétiques pour augmenter l’efficacité interne. Pour cette raison, si votre liste d’arguments inclut des expressions qui appellent d’autres procédures, vous ne devez pas supposer que ces expressions seront appelées dans un ordre particulier.
Procédures de sous-procédures asynchrones
La fonctionnalité Async vous permet d'appeler des fonctions asynchrones sans utiliser de rappels explicites ni fractionner manuellement votre code entre plusieurs fonctions ou expressions lambda.
Si vous marquez une procédure avec le modificateur async, vous pouvez utiliser l’opérateur await dans la procédure. Quand le contrôle atteint une expression Await
dans la procédure Async
, il retourne à l’appelant, et la progression dans la procédure est interrompue jusqu’à ce que la tâche attendue soit terminée. Quand la tâche est terminée, l'exécution peut reprendre dans la procédure.
Notes
Une procédure Async
retourne à l’appelant lorsque le premier objet attendu qui n’est pas encore terminé est rencontré ou que la fin de la procédure Async
est atteinte, selon ce qui se produit en premier.
Vous pouvez également marquer une instruction Function avec le modificateur Async
. Une fonction Async
peut avoir un type de retour Task<TResult> ou Task. Un exemple plus loin dans cette rubrique montre une fonction Async
qui a un type de retour Task<TResult>.
Les procédures Async
Sub
sont principalement utilisées pour les gestionnaires d’événements pour lesquels une valeur ne peut pas être retournée. Une procédure Async
Sub
ne peut pas être attendue et l’appelant d’une procédure Async
Sub
ne peut pas intercepter les exceptions levées par la procédure Sub
.
Une procédure Async
ne peut pas déclarer de paramètres ByRef.
Pour plus d’informations sur les procédures Async
, consultez Programmation asynchrone avec Async et Await, Flux de contrôle dans les programmes asynchroneset Types de retour asynchrones.
Exemple 1
L’exemple suivant utilise l’instruction Sub
pour définir le nom, les paramètres et le code qui forment le corps d’une procédure 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
Exemple 2
Dans l'exemple suivant, DelayAsync
est une Async
Function
dont le type de retour est Task<TResult>. DelayAsync
a une instruction Return
qui retourne un entier. Ainsi, la déclaration de méthode de DelayAsync
doit avoir un type de retour de Task(Of Integer)
. Comme le type de retour est Task(Of Integer)
, l’évaluation de l’expression Await
dans DoSomethingAsync
produit un entier, comme l’instruction suivante le montre : Dim result As Integer = Await delayTask
.
La procédure startButton_Click
est un exemple de procédure Async Sub
. Étant donné que DoSomethingAsync
est une fonction Async
, la tâche de l’appel à DoSomethingAsync
doit être attendue, comme l’indique l’instruction suivante : Await DoSomethingAsync()
. La procédure startButton_Click
Sub
doit être définie avec le modificateur Async
, car elle a une expression 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