Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Déclare le nom, les paramètres et le code qui définissent une procédure Function.
Syntaxe
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function
Éléments
attributelistOptionnel. Consultez la Liste des attributs.
accessmodifierOptionnel. Il peut s'agir d'une des méthodes suivantes :
Consultez Access levels in Visual Basic.
proceduremodifiersOptionnel. Il peut s'agir d'une des méthodes suivantes :
MustOverride OverridesNotOverridable Overrides
SharedOptionnel. Consultez Partagé.
ShadowsOptionnel. Consultez Shadows.
AsyncOptionnel. Voir Async.
IteratorOptionnel. Consultez Iterator.
nameObligatoire. Nom de la procédure. Consultez Declared Element Names.
typeparamlistOptionnel. Liste des paramètres de type pour une procédure générique. Consultez Liste de types.
parameterlistOptionnel. Liste des noms de variables locales représentant les paramètres de cette procédure. Consultez la Liste des paramètres.
returntypeObligatoire si
Option StrictestOn. Le type de données de la valeur renvoyée par cette procédure.ImplementsOptionnel. Indique que cette procédure implémente une ou plusieurs procédures
Function, chacune définie dans une interface implémentée par la classe ou la structure contenant cette procédure. Consultez Instruction Implements.implementslistObligatoire si
Implementsest utilisé. Liste des procéduresFunctionen cours d'implémentation.implementedprocedure [ , implementedprocedure ... ]Chaque
implementedprocedureemploie la syntaxe et les éléments suivants :interface.definednameÉlément Description interfaceObligatoire. Nom d’une interface implémentée par la classe ou la structure contenant cette procédure. definednameObligatoire. Nom par lequel la procédure est définie dans interface.HandlesOptionnel. Indique que cette procédure peut gérer un ou plusieurs événements spécifiques. Voir Handles.
eventlistObligatoire si
Handlesest utilisé. Liste des événements gérés par cette procédure.eventspecifier [ , eventspecifier ... ]Chaque
eventspecifieremploie la syntaxe et les éléments suivants :eventvariable.eventÉlément Description eventvariableObligatoire. Variable objet déclarée avec le type de données de la classe ou de la structure qui déclenche l’événement. eventObligatoire. Nom de l’événement géré par cette procédure. statementsOptionnel. Bloc d’instructions à exécuter dans cette procédure.
End FunctionMet fin à la définition de cette procédure.
Notes
Tout le code exécutable doit se trouver à l’intérieur d’une procédure. Chaque procédure, à son tour, est déclarée au sein d’une classe, d’une structure ou d’un module appelé classe, structure ou module conteneur.
Pour retourner une valeur au code appelant, utilisez une procédure Function ; sinon, utilisez une procédure Sub.
Définir une fonction
Vous ne pouvez définir une procédure Function qu'au niveau du module. Par conséquent, le contexte de déclaration d’une fonction doit ê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 Function par défaut pour l’accès public. Vous pouvez ajuster leurs niveaux d’accès avec les modificateurs d’accès.
Une procédure Function peut déclarer le type de données de la valeur retournée par la procédure. Vous pouvez spécifier le type de données de votre choix ou le nom d’une énumération, d’une structure, d’une classe ou d’une interface. Si vous ne spécifiez pas le paramètre returntype, la procédure renvoie Object.
Si cette procédure utilise le mot clé Implements, la classe ou la structure qui la contient doit également comporter 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 Function (en definedname) n’a pas besoin de correspondre au nom de cette procédure (en name).
Notes
Vous pouvez utiliser des expressions lambda pour définir des expressions de fonction Inline. Pour plus d’informations, consultez Expression de fonction et Expressions lambda.
Retourner à partir d’une fonction
Lorsque la procédure Function retourne au code appelant, l’exécution continue avec l’instruction qui suit l’instruction qui a appelé la procédure.
Pour renvoyer une valeur d’une fonction, vous pouvez attribuer la valeur au nom de la fonction ou l’inclure dans une instruction Return.
L’instruction Return attribue simultanément la valeur de retour et quitte la fonction, comme l’illustre l’exemple suivant.
Function MyFunction(ByVal j As Integer) As Double
Return 3.87 * j
End Function
L’exemple suivant attribue la valeur de retour au nom de la fonction myFunction, puis utilise l’instruction Exit Function pour renvoyer.
Function MyFunction(ByVal j As Integer) As Double
MyFunction = 3.87 * j
Exit Function
End Function
Les instructions Exit Function et Return provoquent une sortie immédiate d’une procédure Function. Tout nombre d’instructions Exit Function et Return peut apparaître où que ce soit dans la procédure, et vous pouvez associer des instructions Exit Function et Return.
Si vous utilisez Exit Function sans attribuer de valeur à name, la procédure retourne la valeur par défaut pour le type de données spécifié dans returntype. Si returntype n’est pas spécifié, la procédure renvoie Nothing, qui est la valeur par défaut pour Object.
Appel d’une fonction
Vous appelez une procédure Function à l’aide du nom de la procédure, suivie de la liste d’arguments entre parenthèses, dans une expression. 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.
Vous appelez une procédure Function de la même façon que vous appelez n’importe quelle fonction de bibliothèque telle que Sqrt, Cosou ChrW.
Vous pouvez également appeler une fonction à l’aide du mot clé Call. Dans ce cas, la valeur de retour est ignorée. L’utilisation du mot clé Call n’est pas recommandée dans la plupart des cas. Pour plus d’informations, consultez Instruction Call.
Visual Basic réorganise parfois les expressions arithmétiques pour augmenter l’efficacité interne. Pour cette raison, vous ne devez pas utiliser de procédure Function dans une expression arithmétique lorsque la fonction modifie la valeur des variables dans la même expression.
Fonctions 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 fonction avec le modificateur Async, vous pouvez utiliser l’opérateur Await dans la fonction. Quand le contrôle atteint une expression Await dans la fonction Async, il retourne à l’appelant, et la progression dans la fonction 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 fonction.
Notes
Une procédure Async retourne à l'appelant quand elle rencontre le premier objet attendu qui n'est pas encore terminé, ou quand elle atteint la fin de la procédure Async, selon la première éventualité.
Une fonction Async peut avoir un type de retour Task<TResult> ou Task. Un exemple de fonction Async ayant un type de retour Task<TResult> est fourni ci-dessous.
Une fonction Async ne peut pas déclarer de paramètres ByRef.
Une instruction Sub peut également être marquée avec le modificateur Async. Ceci est principalement utilisé 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.
Pour plus d’informations sur les fonctions Async, consultez Programmation asynchrone avec Async et Await, Flux de contrôle dans les programmes Async et Types de retour Async.
Fonctions d’itérateur
Une fonction d’itérateur exécute une itération personnalisée sur une collection, comme une liste ou un tableau. Une fonction d’itérateur utilise l’instruction Yield pour retourner chaque élément un par un. Quand une instruction Yield est atteinte, l’emplacement actif dans le code est mémorisé. L’exécution est redémarrée à partir de cet emplacement lors de l’appel suivant de la fonction d’itérateur.
Vous appelez un itérateur depuis le code client en utilisant une instruction For Each...Next.
Le type de retour d’une fonction d’itérateur peut être IEnumerable, IEnumerable<T>, IEnumerator ou IEnumerator<T>.
Pour plus d'informations, consultez Itérateurs.
Exemple 1
L’exemple suivant utilise l’instruction Function pour déclarer le nom, les paramètres et le code qui forment le corps d’une procédure Function. Le modificateur ParamArray permet à la fonction d’accepter un nombre variable d’arguments.
Public Function CalcSum(ByVal ParamArray args() As Double) As Double
CalcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
CalcSum += args(i)
Next i
End Function
Exemple 2
L’exemple suivant appelle la fonction déclarée dans l’exemple précédent.
Module Module1
Sub Main()
' In the following function call, CalcSum's local variables
' are assigned the following values: args(0) = 4, args(1) = 3,
' and so on. The displayed sum is 10.
Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
Console.WriteLine("Sum: " & returnedValue)
' Parameter args accepts zero or more arguments. The sum
' displayed by the following statements is 0.
returnedValue = CalcSum()
Console.WriteLine("Sum: " & returnedValue)
End Sub
Public Function CalcSum(ByVal ParamArray args() As Double) As Double
CalcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
CalcSum += args(i)
Next i
End Function
End Module
Exemple 3
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). Étant donné que le type de retour est Task(Of Integer), l’évaluation de l’expression Await dans DoSomethingAsync produit un entier. Ceci est illustré dans cette instruction : 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 le démontre 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