Procédures génériques dans Visual Basic

Mise à jour : novembre 2007

Une procédure générique, appelée également méthode générique, est une procédure définie avec au moins un paramètre de type. Cela permet au code appelant d'adapter les types de données à ses besoins à chaque fois qu'il appelle la procédure.

Une procédure n'est pas générique simplement du fait qu'elle est définie au sein d'une classe ou d'une structure générique. Pour être générique, la procédure doit prendre au moins un paramètre de type, en plus de tous les paramètres normaux qu'il peut prendre. Une classe ou une structure générique peut contenir des procédures non génériques. Une classe, une structure ou un module non générique peut contenir des procédures génériques.

Une procédure générique peut utiliser ses paramètres de type dans sa liste de paramètres normale, dans son type de retour le cas échéant et dans son code de procédure.

Inférence de type

Vous pouvez appeler une procédure générique sans fournir du tout d'arguments de type. Si vous l'appelez de cette façon, le compilateur essaie de déterminer les types de données appropriés à passer aux arguments de type de la procédure. C'est ce qu'on appelle l'inférence de type. Le code suivant affiche un appel dans lequel le compilateur infère qu'il doit passer le type String au paramètre de type t.

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

Si le compilateur ne peut pas inférer les arguments de type à partir du contexte de votre appel, il signale une erreur. Une cause possible d'une telle erreur est une incompatibilité de rang de tableau. Par exemple, supposons que vous définissez un paramètre normal comme un tableau de paramètre de type. Si vous appelez la procédure générique fournissant un tableau d'un rang différent (nombre de dimensions), l'incompatibilité entraîne l'échec de l'inférence du type. Le code suivant affiche un appel dans lequel un tableau à deux dimensions est passé à une procédure qui attend un tableau unidimensionnel.

Public Sub demoSub(Of t)(ByVal arg() As t)

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

Vous pouvez appeler l'inférence de type uniquement en omettant tous les arguments de type. Si vous fournissez un argument de type, vous devez les fournir tous.

L'inférence de type est prise en charge uniquement pour les procédures génériques. Vous ne pouvez pas appeler l'inférence de type sur les classes, les structures, les interfaces ou les délégués génériques.

Exemple

Description

L'exemple suivant définit une procédure Function générique destinée à rechercher un élément particulier dans un tableau. Il définit un paramètre de type et l'utilise pour construire les deux paramètres dans la liste de paramètres.

Code

Public Function findElement(Of T As IComparable) _
    (ByVal searchArray As T(), ByVal searchValue As T) As Integer
    If searchArray.GetLength(0) > 0 Then
        For i As Integer = 0 To searchArray.GetUpperBound(0)
            If searchArray(i).CompareTo(searchValue) = 0 Then Return i
        Next i
    End If
    Return -1
End Function

Commentaires

L'exemple précédent nécessite la capacité à comparer searchValue par rapport à chaque élément de searchArray. Pour garantir cette capacité, il contraint le paramètre de type T à implémenter l'interface IComparable<T>. Le code utilise la méthode CompareTo au lieu de l'opérateur =, parce qu'il n'y a aucune garantie qu'un argument de type fourni pour T prenne en charge l'opérateur =.

Vous pouvez tester la procédure findElement à l'aide du code suivant.

Public Sub tryFindElement()
    Dim stringArray() As String = {"abc", "def", "xyz"}
    Dim stringSearch As String = "abc"
    Dim integerArray() As Integer = {7, 8, 9}
    Dim integerSearch As Integer = 8
    Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
    Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
    MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
    MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
    MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

Les appels précédents à MsgBox affichent "0", "1" et "-1" respectivement.

Voir aussi

Tâches

Comment : définir une classe qui fournisse des fonctionnalités identiques pour différents types de données

Comment : utiliser une classe générique

Concepts

Types génériques en Visual Basic

Procédures dans Visual Basic

Paramètres et arguments d'une procédure

Référence

Liste de types

Liste de paramètres