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 : utiliser une classe générique
Concepts
Types génériques en Visual Basic
Paramètres et arguments d'une procédure