|
Site |
Cours VB.net |
|
|
|
Les génériques VB 2005. |
|
|
Super complexe? non!!
Définition.
A
partir de VB
Un type générique (generic) permet de créer une Classe, ou une procédure, ayant des Data Types non définis au départ.
En d'autres termes, les paramètres et variables n'ont pas de type: ce ne sont pas des Strings, des Integers.. Ce sont des génériques. Quand on utilise la Classe ou la procédure, on indique le type.
Les génériques nous permettent de définir un comportement ou un algorithme commun sur les types ou un sous ensemble de types .Net. Ils sont un moyen de mutualiser un comportement.
Créons une classe MyClasse; Of permet d'indiquer le generic:
Public Class MyClasse(Of t)
' Insérer le code qui utilise le data type t.
Dim tempItem As t
End Class Ici t est le 'generic'; t pourra être une entier, une string.... On peut ensuite utiliser cette classe avec des Integer ou des String: |
Public UneClass As New MyClasse(Of Integer) Friend stringClass As New MyClasse(Of String) |
Exemple de Fonction utilisant un 'generic'.
Permettant d'en comprendre l'intérêt:
Créons une sub Swap fonctionnant pour tous les types de données:
Private Sub Swap(Of
ItemType) (ByRef v1 As ItemType, ByRef v2 As ItemType)Dim temp As ItemType
temp = v1
v1 = v2
v2 = temp
End Sub
Notons que en plus des 2 paramètres V1 et V2 à 'swapper' ,"Of ItemType" indique le type de donnée qui doit être utilisé.
Si on a 2 entiers à swapper, il faut appeler la fonction Swap comme cela:
Swap(Of Integer)(v1, v2)
Si c'est des Strings:
Swap(Of String)(v1, v2)
Le JIT compile la fonction Swap comme si elle avait été écrite pour des Strings.
Sans les génériques j'aurais du écrire plusieurs routines de code pour chaque Type. Or en utilisant les génériques cette redondance peut être évitée.
Exemple de Classe utilisant un 'generic'.
De la même manière, on peut créer une Classe entièrement générique:
Public Class SomeClass(Of ItemType)
Private internalVar as ItemType ' variable generic
Public Function SomeMethod(ByVal value As ItemType) As ItemType
'Fonction acceptant un generic comme paramètre
End Function
End Class
Exemple de Collection utilisant un 'generic'
On peut créer une collection générique (
System.Collections.Generic) et lui imposer un type.Exemple: créons une collection de String : List(Of String).
D
im l As New System.Collections.Generic.List(Of String)l.Add(
"toto") 'On ajoute une string Dim S As String = l.Item(0) ' l'item est bien typé : même avec 'Option Strict=on' pas besoin de CType.Habituellement les collections contiennent des objets; ici c'est une collection de String.
Je ne peux y mettre que des String (sinon cela provoque une erreur)
Comme par définition c'est des string, il n'y a pas de conversion String=>Objet et Objet=>String (pas de boxing/unboxing)
On peut aussi créer des Stack(Of..) Queue(Of..), Dictionnary(Of..) SortedList(Of..)..
Intérêts des génériques ?
Pourquoi ne pas utiliser des types 'Object', à la place des génériques?
Les génériques sont fortement typés.
Ils sont plus rapides que l'usage des objets.
S'il y a erreur, elle se produit probablement à la compilation et pas au RunTime.
Cela permet d'utiliser l'intellisense.
En VB:
il y a des classes
permettant l'usage de génériques:
Exemple:
On peut utiliser des méthodes génériques pour travailler sur les tableaux.
Exemple recherche dans un tableau de short nommé monTab l'élément 2
index= Array.indexOf (Of Short)(monTab, 2) est hyper plus rapide que
index= Array.indexOf (monTab, 2) car la première version avec généric est directement optimisée pour les Short.
Il est est de même pour Binarysearch et Sort.
Cela est valable pour les types 'valeur' (peu d'intérêts pour les strings par exemple).
En VB
Collections génériques:
On peut créer une collection générique (
System.Collections.Generic) et lui imposer un type.Exemple: créons une collection de String (List(Of String)): Elle est typée car elle ne peut contenir que des 'String'.
D
im l As New System.Collections.Generic.List(Of String)Il s'agit d'une List avec Index.
l.Add(
"toto") 'On ajoute une string Dim S As String = l.Item(0) ' l'item est bien typé : même avec 'Option Strict=on' pas besoin de CType.
Il y a aussi de nouveaux types de collections génériques
Les Dictionnary(Of..) avec Clé et valeur
Les SortedDictionnary(Of..) avec Clé et valeur trié.
Les LinkedList(Of..) Liste Chaînée, chaque élément comportant une propriété Value, Next et Previous.
Les SortedList(Of..)..
Les Stack(Of..)
Les
Queue(Of..)
Collections spécialisées:
L'espace
System.Collections.Specialized fournit de nouveau type de collection très spécifiques:Exemple: ListDictionary avec Clé et Valeur:
Dim l As New
System.Collections.Specialized.ListDictionaryl.Add(2,
"toto")On peut aussi créer des collections 'composées'
Dim genericColl As New System.Collections.Generic.Dictionary(Of String, String)
genericColl.Add("PremiereClé", item1)
BitVector32 est un type de
collection qui contient des Booléens ou des entiers.
StringCollection est un type de collection
String.
Intérêts de ses collections est qu'elle sont fortement typées: Elle n'acceptent que des éléments d'un type: des String dans le dernier exemple.
|
|
|
|
|