Site:  Cours VB.net  
1.8 Les constantes, les énumérations.

             p

Les constantes.

Les énumérations.

Généralisations, énumérations fournies par VB.

 

Constantes:

Comme les variables, elles ont un nom et un type, mais leurs valeurs sont 'constantes'.

On les déclare par le mot Const, on peut les initialiser en même temps avec =

 

Exemple :

Const NOMDUPROGRAMME= "LDF"   constante de type String (chaîne de caractères).

Const NOMBREDECASE As Integer = 12        constante de type Integer

Ensuite on peut utiliser la constante:

For k= 0 To NOMBREDECASE

...

Next k

Si on utilise: For k=0 To 12, à la lecture c'est moins clair.

 

Si on écrit: NOMBREDECASE=13 cela déclenche une erreur!!

Habituellement, les constantes sont créées en début de programme.

 

Il est conseillé par convention d'écrire le nom des constantes en majuscules.

 

Intérêt des constantes ?

  -Améliore la lisibilité et évite d'utiliser des constantes littérales:

Il faut éviter:

For i=0 To 100    'A quoi correspond 100?

..

Next i

Il faut écrire

Const NBMAXPATIENT As Integer= 100

For i=0 To NBMAXPATIENT

..

Next i

 

 -Modifications du code facilitées:

Si une constante doit être modifiée ultérieurement, il suffit en mode conception, de modifier sa valeur ce qui modifie sa valeur dans l’ensemble du code de l’application.

Const NBMAXPATIENT As Integer= 200 'Si j'introduis une modification de valeur

For i=0 To NBMAXPATIENT            'Toutes les boucles utilisant NBMAXPATIENT seront à jour

Next i

 

 -Amélioration la vitesse.

Const NBMAXPATIENT As Integer= 100 

Dim nombre= NBMAXPATIENT

est plus rapide que:

Dim nbpatient As Integer= 100 

Dim nombre= nbpatient

Car le compilateur code directement nombre=20 dans le premier cas.

 

On rappelle que seuls les types primitifs peuvent avoir des constantes ( Byte, Boolean, Short, Integer, Long, Single, Double, Decimal, Date, Char, String)

 

Constantes prédéfinies dans le langage:

Les constantes de Visual Basic sont toujours là:

vbOk    'retourné par une MessageBox quand l'utilisateur a cliqué sur Ok.

vbBack

vbCancel

vbCrLf     'caractère numéro 13 (Cr) puis numéro 10 (Lf)

 

True False:

On rappelle que True et False sont des valeurs Booléens faisant partie intégrante de VB.

Pour les anciens de VB6 ne plus utiliser -1 et 0 (D'ailleurs c'est maintenant 1 et 0).

 

Mais, en plus, dans Visual Basic .NET, la plupart des constantes sont remplacées par des énumérations.

(Voir plus bas )

 

Utiliser largement ces constantes fournies par VB, cela améliore la lisibilité et la maintenance.

 

Énumération:

Les énumérations sont utilisées lorsque l'on a un jeu de constantes liées logiquement.

Un bloc Enum permet de créer une liste (une énumération) de constantes:

Enum TypeFichier

    DOC

    RTF

    TEXTE

End Enum

 

Les constantes ainsi créées sont

TypeFichier.DOC

TypeFichier.RTF

TypeFichier.TEXTE

 

Le bloc Enum doit être dans l'en-tête du module (en haut).

C'est bien pratique car en écrivant le code, dès que je tape TypeFichier. la liste (DOC RTF TEXTE) apparaît.

Ensuite, on peut utiliser dans le programme les constantes créées.

fichierEnCours= TypeFichier.DOC    par exemple.

On peut ensuite tester:

If fichierEnCours= TypeFichier.RTF then    par exemple.

Il est conseillé par convention d'écrire le nom des énumérations en minuscules avec la première lettre en majuscules.

 

Ce qui suit concernant les énumérations est un peu plus complexe:

Chaque constante littérale de l'énumération a une valeur par défaut.

Par défaut

TypeFichier.Doc =0 

TypeFichier.RTF =1

TypeFichier.TEXTE=2

..

La première valeur est 0.

Si on ne spécifie rien, les valeurs sont des Integers

Parfois le nom utilisé dans l'énumération (la constante littérale) est suffisant en soi et on n'utilise pas la valeur : Dans un programme gérant des fichiers, une variable prendra la valeur TypeFichier.Doc pour indiquer qu'on travaille sur les fichiers .DOC. Peu importe la valeur de la constante.

 Mais d'autres fois il faut que chaque constante de l'énumération possède une valeur particulière.

Je peux imposer une valeur à chaque constante de l'énumération :

Enum TypeFichier

    DOC=2

    RTF=4

    TEXTE=8

End Enum

Cela évite d'écrire fichierEnCours= 15 (en retenant que 15=fichier doc, 30= fichier rtf...)

 

Je peux même donner plusieurs valeurs avec And et Or à condition d'utiliser l'attribut Flags.

<Flags()> Enum TypeFichier

    DOC=2

    RTF=4

    TEXTE=8

    TOUS= DOC AND RTF AND TEXTE

End Enum

 

 

L'attributs <Flags()> indique que les valeurs sont codées en bits, ce qui permet les combinaisons de valeurs. (pour 2 le second bit est à 1, pour 4 le troisième bit est à 1, pour 8, le quatrième bit est à 1...)  (voir chapitre sue l'algèbre de Boole.) C'est pour cela qu'on a donné les valeurs 2, 4, 8 et non 1, 2, 3.

 

 

Les énumérations sont des types qui héritent de System.Enum et qui représentent symboliquement un ensemble de valeurs. Par défaut ses valeurs sont des 'Integer' mais on peut spécifier d'autres types: Byte, Short, Integer ou Long.
L'exemple suivant déclare une énumération dont le type sous-jacent est Long :
 

Enum Color As Long
 Red
 Green
 Blue
End Enum

 

Habituellement, on utilise les énumérations dans le code, comme des constantes.

Exemple:

Enum TypeFichier

    DOC=2

    RTF=4

    TEXTE=8

End Enum

 

' affecter à une variable:

Dim monFichier As TypeFichier = TypeFichier.RTF

On remarque qu'on crée une variable de nom du type énumération dans laquelle on ne peut mettre q'une énumération (en fait un Integer). 

 

' affichage d'une valeur

Console.Out.WriteLine("Numéro type du fichier=" & monFichier)

Affiche: 4

Console.Out.WriteLine("Type du fichier=" & monFichier.ToString)

Affiche: RTF

 

' test avec la constante de l'énumération

If (monFichier = TypeFichier.RTF) Then

    Console.Out.WriteLine("C'est du RTF")

End If

Affiche:"C'est du RTF"

Mais parfois on a besoin de récupérer la liste des éléments d'une énumération.

Comment relire la liste des énumérations?

Il faut utiliser une méthode statique (ne nécessitant pas d'instanciation) GetValues pour obtenir toutes les constantes littérales ou valeurs d'un type énuméré que l'on passe en paramètre.

' liste des mentions littérales (Constantes)

For Each t As TypeFichier In [Enum].GetValues(monFichier.GetType)

    Console.Out.WriteLine(t.ToString)

Next

' liste des mentions entières (Valeurs)

For Each t As Integer In [Enum].GetValues(monFichier.GetType)

    Console.Out.WriteLine(t)

Next

Affiche:

DOC

RTF

TEXTE

2

4

8

 

Si on affecte un élément d'une énumération à une variable Integer, on récupère la valeur, si on utilise ToString on récupère la constante littérale.

Dim n As Integer

n = TypeFichier.RTF

Console.Out.WriteLine(n.ToString)

Dim st As String

st = TypeFichier.RTF.ToString

Console.Out.WriteLine(st)

Affiche

2

RTF

 

Comment récupérer dans une énumération une constante à partir de sa valeur ou une valeur à partir de la constante?

Ici il faut instancier:

Dim s As Type = GetType(TypeFichier)

Console.Out.WriteLine(CType([Enum].GetName(s, 15), String))

Console.Out.WriteLine(CType([Enum].Parse(s, "DOC"), String))

 

Affiche:

DOC

2

 

 

Généralisation de la notion d'énumération:

Noter que VB.Net contient, comme on l'a vu, un tas de constantes classées à l'aide d' Enumération.

ControlChars:

Cette énumération contient les caractères de contrôle.

ControlChars.CrLf       Chr$(13)+Chr$(10) qui sert à sauter à la ligne dans une chaîne de caractères :

 Si on affiche "VISUAL" & ControlChars.CrLf & "BASIC"

 On obtient à l’écran :

VISUAL

BASIC

 

ControlChars.Tab        Chr$(9) = caractère de tabulation

ControlChars.NullChar   Aucun caractère

ControlChars.Nothing    Chaîne vide

ControlChars.Back

Taper ControlChars.  Et comme d’habitude vous obtiendrez la liste des constantes.

 

Couleurs:

On peut aussi utiliser l'énumération des couleurs définies par le Framework

System.Drawing.Color.Blue    Pour le bleu

ou en simplifiant (si Imports System.Drawing a été écrit)

Color.Chocolate

Color.Black

..

 

Math:

Si Imports System.Math est présent en haut du module,

PI    contient 3,14…

    contient la base log naturel

 

Touche du clavier dans le Framework:

Il est parfois nécessaire de savoir si une touche précise à été tapée par l'utilisateur au clavier, pour cela il faut connaître les touches, mais pas besoin de se souvenir du codes des touches, il suffit de taper Keys. et la liste des touches s'affiche. Cliquer sur le nom de la touche recherchée et vous obtenez la constante correspondant à la touche:

Keys.Right    'Désigne le code de la touche '->'

Keys.D8       'Désigne le code de la touche '8'

Keys.Delete   'Désigne le code de la touche 'Suppr'

Keys.D        'Désigne le code de la touche 'D'

Keys.Shift    'Désigne le code de la touche 'Majuscule'

Keys.SnapShot 'Désigne le code de la touche 'Impression écran'

 

Autre Énumération, un exemple:

Quand on ferme une MessageBox.(une fenêtre qui affiche un message), cela retourne une valeur qui contient:

MsgBoxResult.Yes

MsgBoxResult.No    ou

MsgBoxResult.Cancel

En fonction du bouton qu'a utilisé l'utilisateur pour sortir de la fenêtre MessageBox (appuie sur les boutons Oui, Non, Cancel) .