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 :

  • 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édures Sub 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 AsyncSub sont principalement utilisées pour les gestionnaires d’événements, où une valeur ne peut pas être retournée. Une procédure AsyncSub ne peut pas être attendue et l’appelant d’une procédure AsyncSub 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 AsyncFunction 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_ClickSub 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

Voir aussi