La déclaration des variables peut être implicite en VB. Cela signifie qu’une variable acquiert le type de la donnée qui lui est affectée.
X = "Bonjour" assigne à X le type String et lui affecte la valeur Bonjour.
Cependant, cette facilité doit être délaissée par le programmeur qui lui préférera la déclaration explicite des variables.
Dim X As String X = "Bonjour"
La déclaration implicite, qui n’existe d’ailleurs pas dans tous les langages (Fortran, Cobol, Pascal, C, C++), présente l’inconvénient d’exposer le programmeur à une correction fastidieuse des fautes de frappes.
La déclaration explicite des variables ne met pas le programmeur à l’abri de telles fautes, mais celles-ci lui sont signalées immédiatement pour autant qu’il ait placé la directive Option Explicit On en tête de chaque page de code. Dans Visual Studio .Net, cette option peut être fixée dans les propriétés du projet, sous l’onglet Compiler.
La déclaration d’une variable se compose de trois parties essentielles :
Un nom de variable, de même que celui de tout autre objet, doit être aussi représentatif que possible du rôle de l’objet dans le code. Il est idéalement écrit en lettres majuscules et minuscules (non accentuées) combinées de sorte à faciliter la lecture. Il peut contenir des chiffres et le caractère de soulignement, mais il ne peut commencer par un chiffre.
- la définition de la portée de la variable - la définition de son nom
- la définition de son type
Private X As String
La portée est définie par les mots Dim, Private, Public, Static, Protected, Friend, Protected Friend,
Shadows, Shared, ReadOnly et par certaines associations de ces mots. Elle détermine l’espace d’accessibilité aux variables.
Il existe trois principaux lieux de déclarations des variables où l’emploi de ces mots est requis : - en tête de modules ou de classes
- à l’intérieur de procédures et de fonctions - à l’intérieur de blocs de codes
Dim
La variable déclarée avec Dim en tête d’un module ou d’une classe est accessible de n'importe quel endroit de ce module ou de cette classe où elle n’est pas redéfinie (effet de masque), mais pas dans une sous-classe. Si elle est déclarée à l’intérieur d’une procédure, d’une fonction ou d’un bloc de code, elle n’est visible que dans cette partie du code où elle bénéficie de l’effet de masque.
Public Class Class1
Dim VarGlobClass1 As Integer Dim UneAutreVar As Integer
Private Sub MaSub()
Dim VarLocMaSub As Byte
VarGlobClass1 = 11 ' Visible dans sa classe
Un bloc de code ne bénéficie pas de l’effet de masque par rapport aux variables déclarées dans sa procédure ou sa fonction.
Dans l’exemple ci contre, il serait interdit de redéclarer
VarLocMaSub dans le bloc If, tandis qu’il est permis de
redéclarer UneAutreVar.
UneAutreVar = 12 ' Celle-ci aussi
VarLocMaSub = 13 ' N’est visible que dans MaSub
If VarGlobClass1 > 100 then Dim VarBlocIf As Byte
VarBlocIf = 14 ' Visible dans son bloc de code
Else
Dim UneAutreVar As Byte ' Visible dans son bloc de code et masque la
' variable de même nom déclarée en tête de Class1
' VarBlocIf = 15 ' Erreur : la variable n'est pas visible ici
End If End Sub
Private Class SousClass Private Sub UneSUb()
' VarGlobClass1 = 16 ' Erreur : la variable n'est pas visible ici
End Sub End Class End Class
Private
La variable déclarée avec Private en tête d’un module ou d’une classe est accessible de n'importe quel endroit de ce module ou de cette classe où elle n’est pas redéfinie (effet de masque), mais pas dans une sous-classe.
Public Class Class1
Private VarGlobClass1 As Integer
Private Sub MaSub()
VarGlobClass1 = 11 ' Visible dans sa classe
End Sub
Private Class SousClass Private Sub UneSUb()
' VarGlobClass1 = 16 ' Erreur : la variable n'est pas visible ici
End Sub End Class End Class
Public
La déclaration Public ne peut se faire qu’en tête d’un module ou d’une classe. La variable ainsi déclarée est accessible dans sa classe, mais pas dans une sous-classe. Elle est aussi accessible de n'importe quel endroit de l’application en cours de développement par la désignation d’une instance de sa classe ou du nom de son module. De plus, si une variable est ainsi déclarée dans une classe, elle est aussi accessible de toute instance de la classe compilée et référencée dans un projet. Attention, la déclaration Public d’une variable de classe est en infraction avec le contrôle d’accès préconisé en POO.
Module MonModule
Public VarGlobMonModule As Integer Sub Main()
VarGlobMonModule = 17 ' Visible dans tout le code de son module
End Sub End Module
Public Class Class1
Public VarGlobClass1 As Integer
Private Sub MaSub()
VarGlobClass1 = 11 ' Visible dans sa classe
MonModule.VarGlobMonModule = 1 ' Visible via le nom du module
End Sub
Private Class SousClass Private Sub UneSUb()
Dim VarLoc As Class1
' VarGlobClass1 = 16 ' Erreur : la variable n'est pas visible ici
VarLoc.VarGlobClass1 = 16 ' Visible via le nom d’une variable de type Class1
End Sub End Class End Class
Static
La déclaration Static n’est permise qu’à l’intérieur d’une procédure, d’une fonction, ou d’un bloc de code et elle n’est visible que dans cette portée où elle est déclarée. Une telle variable n’est initialisée qu’au premier appel du code qui la contient et conserve ainsi la dernière valeur qui lui est affectée dans cette partie du programme. Cette valeur est donc récupérable d’un appel à l’autre du code contenant la déclaration.
Private Sub UneSub()
Static Passage As Integer = 1 La variable Passage n’est initialisée qu’au premier
appel de la procédure UneSub.
Passage garde ensuite sa dernière valeur affectée par Passage = Passage + 1 et ce, jusqu’à l’arrêt du programme.
' … code de la procédure
MessageBox.Show("Passage n° : " & Passage) Passage = Passage + 1
End Sub
Protected
La déclaration Protected ne peut se faire qu’en tête d’une classe. La variable ainsi déclarée est accessible dans sa classe, bien sûr, mais aussi dans toute classe qui en dérive (héritage).
Public Class Class1
Protected VarClass1 As Integer
Private Sub MaSub()
VarClass1 = 11 ' Visible dans sa classe
End Sub End Class
Public Class Class2
Inherits Class1 ' Héritage de Class1 : Class1 peut ne pas être écrite ici, ' mais être une dll compilée et référencée dans le projet
Private Sub MaSub()
Dim VarObjet As New Class1
VarObjet.VarClass1 = 1 ' Visible via le nom de la variable de type Class1
End Sub End Class
Friend
La déclaration Friend peut se faire en tête d’une classe ou en tête d’un module et est dans ce cas, synonyme de
Public mais seulement dans le projet en cours.
La variable déclarée avec Friend en tête d’une classe est accessible à partir de toute instanciation de sa classe dans le projet.
Public Class Class1
Friend VarClass1 As Integer
Private Sub MaSub()
VarClass1 = 11 ' Visible dans sa classe
End Sub End Class
Public Class Class2 ' Class2 appartient au même projet que Class1
Private Sub MaSub() Dim VarObjet As Class1
VarObjet.VarClass1 = 1 ' Visible via le nom de la variable de type Class1
End Sub End Class
Protected Friend
La déclaration Protected Friend ne peut se faire qu’en tête d’une classe. La variable déclarée avec Protected Friend en tête d’une classe est accessible à partir de toute instanciation de sa classe dans le projet et dans d’autres projets à partir d’instances dérivées de sa classe compilée et référencée.
Public Class Class1
Protected Friend VarClass1 As Integer
' … VarClass1 est visible dans Class1, partout dans le projet en cours via le ' nom d’une variable de type Class1, et dans les classes héritant de Class1
End Class
Shadows
La déclaration Shadows ne peut se faire qu’en tête d’une classe et n’a d’intérêt que dans une classe dérivée. En effet, elle sert à redéclarer dans la classe dérivée un élément de même nom qui existerait dans la classe mère en masquant ce dernier. Elle palie ainsi à l’absence d’effet de masque dans ce contexte.
Public Class Class1
Protected VarClass1 As Integer Protected DateNais As Date End Class
Public Class Class2
Inherits Class1 ' Héritage de Class1 : Class1 peut ne pas ' être écrite ici, mais être une dll ' compilée et référencée dans le projet
Private Sub MaSub()
' Dim DateNais As String ' Erreur : conflit de nom avec Class1
Dim Shadows DateNais As String ' Le membre de Class1 est masqué
' …
End Sub End Class
Shared
La déclaration Shared ne peut se faire qu’en tête d’une classe. La variable ainsi déclarée est visible dans sa classe et dans ses éventuelles sous-classes ainsi que, selon la déclaration de portée qui lui est associée (Public, Protected,
Friend, …), dans toute instance de sa classe. Mais attention, elle est unique pour toutes les instances et si sa valeur est modifiée dans une instance, elle l’est également dans toutes les autres.
Public Class Class1
Friend Shared VarClass1 As Integer = 0 ' La variable est initialisée à 0
End Class
Public Class Class2 Private Sub MaSub() Dim VarObjet As Class1
VarObjet.VarClass1 = 15 ' La valeur 0 affectée dans Class1 est
End Sub ' remplacée par la valeur 15
End Class
Public Class Class3 Private Sub MaSub() Dim VarObjet As Class1
MessageBox.Show(VarObjet.VarClass1) ' Affichage de la valeur 15
End Sub End Class
ReadOnly (une variable qui n’en est plus une)
La déclaration ReadOnly ne peut se faire qu’en tête d’un module ou d’une classe. La variable ainsi déclarée est visible selon la déclaration de portée qui lui est associée, mais seulement en lecture. Cette variable a donc le comportement d’une constante.
Public ReadOnly Pi As Single = 3.141592
Const (une variable qui n’en est pas une)
Le mot Const n’est pas une déclaration de portée mais celle d’une constante. Employé seul ou accompagné d’une des précisions Private, Public, Protected, Friend, ProtectedFriend et Shadows, il permet la déclaration d’une donnée dont la valeur ne peut plus être modifiée en cours d’exécution. Avec Const employé seul, la constante a une portée locale si elle est déclarée à l’intérieur d’une procédure ou d’une fonction, sinon elle est accessible à tout le code qui se trouve dans la région de la déclaration.
La variable Pi est accessible selon les possibilités offertes par la portée Public, mais elle ne peut être modifiée en nul autre endroit que celui-ci.
La constante Pi est accessible selon les possibilités offertes par la portée Public, mais elle ne peut être modifiée en nul autre endroit que celui-ci.
Public Const Pi As Double = 3.141592