|
Site |
Cours VB.net |
|
|
|
Portée des variables |
|
|
Quand on déclare une variable, jusqu'où est-elle visible?
Quand une variable est visible, on peut l'utiliser.
Dans les procédures.
On déclare une variable avec Dim.
Si on déclare une variable dans une procédure (une Sub ou une Function), elle est visible uniquement dans cette procédure, c'est une variable locale:
Sub MaProcedure (ByRef X As Integer)
Dim Y As Integer
...
End sub
Y est déclaré en début de procédure, on pourra travailler avec Y dans la procédure jusqu'à End Sub
Dans une autre procédure Y ne sera pas visible (l'utilisation de Y déclencherait une erreur.)
Après End Sub Y n'existe plus, son contenu est perdu.
Il en est de même pour X qui est déclaré sur la ligne Sub (X reçoit la valeur envoyée comme paramètre).
Une autre procédure pourra déclarer et utiliser une variable Y, mais, même si elle a le même nom cela ne sera pas la même: chaque variable Y est uniquement visible dans sa procédure.
Variable statique:
Si à la place de Dim on utilise Static, la variable est dite 'Statique': A la sortie de la procédure, la variable et sa valeur continue d'exister et on garde sa valeur; lors des appels suivants de la procédure, on retrouve la valeur de la variable.
Exemple
Sub compteur
Dim A as integer
Static B as integer
A +=1
B +=1
End sub
A chaque appel de cette procédure A prend la valeur, 0 puis 1 puis disparaît.
B prend les valeurs 0, puis 1, puis 2 puis 3... (incrémentation à chaque appel)
Dans un bloc d'instruction.
Si vous déclarez une variable dans un bloc, elle ne sera visible que dans ce bloc:
Do
Dim Compteur A integer
Compteur +=1
...
Loop
La variable Compteur existe uniquement entre Do et Loop
Cela est aussi valable pour les blocs If:
Exemple:
If
A=0 Then Dim risk As String = "Haut" Else Dim risk As String = "Bas" End IfConsole.WriteLine("Le risque est " & Risk)
=> Erreur
Dans la dernière ligne Risk est souligné comme contenant une erreur car il est considéré comme non déclaré. En effet les 2 déclarations Dim risk sont dans les blocs 'If..Else' et 'Else..End If'.
Attention quand même à la position de la variable locale, il peut y avoir des pièges:
Dim i, j, As Integer
For
i = 1 To 10
For J = 1 To 3
Dim k As Integer
K+ =1
'Imprimer k
Next
Next
On souhaite que K=1 puis 2,3,1,2,3.. FAUX!!
Cela donne :1,2,3,4,5,6,7 ....30 !!!??? pas normal
En remplaçant par Dim k As Integer = 0 cela donne
des 1,1,1,1,1, 'normal
Et en intercalant la déclaration de k entre les 2 For, cela marche comme on le
souhaite.1,2,3,1,2,3:
Dim i, j, As Integer
For i = 1 To 10
Dim k As Integer
For J = 1 To 3
K+ =1
'Imprimer k
Next
Next
Dans la section déclaration d'un Module.
Dans la section déclaration d'un module (en haut du module juste après la ligne 'Module'), on utilise à la place de Dim:
Private; dans ce cas la variable est propre au module, elle est visible dans toutes les procédures du module, pas dans les autres modules.
Public; dans ce cas la variable est accessible dans la totalité du programme.
Module Module1
Public A as String
....
Sub MaRoutine
End Sub
End Module
A est accessible partout dans la totalité du programme.
(On parle dans ce cas de variable dite 'Globale')
Dans la section déclaration d'une fenêtre, d'un formulaire.
Dans la section déclaration d'un formulaire (en haut du formulaire juste après la ligne 'Inherits')
Private; indique dans ce cas que la variable est propre au formulaire , elle est visible dans toutes les procédures du formulaire, pas dans les autres modules ou formulaires.
Public; indique de même une variable UNIQUEMENT visible dans le formulaire.
Elle est visible hors du formulaire a condition de la préfixer avec le nom du formulaire.
Class Class1
Inherits System.Windows.Forms
Public A as String
....
Sub MaRoutine
End Sub
End Class
Exemple:
On peut atteindre la zone de déclaration en déroulant le menu de droite.

Dans l'exemple ci dessus:
MaVariable est visible dans le formulaire. et hors du formulaire à condition d'utiliser NomFormulaire.MaVariable.
MaVariable2 est visible dans le formulaire .
MaVariable3 n'est visible que dans la procédure Button1_Click.
En pratique:
Pour se repérer et se souvenir quelle est la portée d'une variable, on utilise une lettre en début du nom de la variable (notation avec un préfixe dite 'hongroise'):
g_MaVariable sera public (g comme global).
m_Variable2 sera accessible au niveau du module.
Dans un module standard, on peut mettre 'Public' toutes les variables que l'on veut rendre accessible à tout le programme. Ce sont les variables (et constantes) générales utilisées dans la totalité de l'application: état du programme, utilisateur en cours...
Pour des raisons que nous verrons plus loin, il faut éviter ce type de variable publiques dites 'globale'.
Dans chaque formulaire on met dans la section déclarations, les variables du module: état du formulaire. Variable permettant l'affichage...
Dans chaque procédure les variables locales, compteur de boucle...
Pour les variables locales on peut donc utiliser un même nom dans différentes procédures, par exemple, on nomme souvent i les variables de boucle dans toutes les procédures, par contre
il faut éviter
de donner un même nom à des variables dont la portée se recoupe.
VB l'accepte et utilise la variable la plus proche, celle du bloc ou du module...mais c'est dangereux et générateur de bugs.
En résumé:
- Celles qui sont Dim sont accessibles dans une procédure.
-
Celles qui sont Public sont
accessibles dans la totalité du programme.
- Celles qui sont Private ne sont
accessibles qu'à l'intérieur même du module.
il
y a en plus:
- Celles qui sont Protected sont
similaires aux Private, mais ils ont
une particularité en cas d'héritage.
- Celles qui sont Friend ne sont
accessibles qu'à l'intérieur du projet, et pas par des éléments extérieurs
au projet en cours.
|
|
|
|
|