• Aucun résultat trouvé

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