Site:  Cours VB.net  
1.13 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 If

Console.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.