Portée dans Visual Basic
La portée d’un élément déclaré est l’ensemble du code qui peut y faire référence sans qualifier son nom ou le rendre disponible via une instruction Imports (espace de noms et type .NET). Un élément peut avoir une portée à l’un des niveaux suivants :
Level | Description |
---|---|
Portée de bloc | Disponible uniquement dans le bloc de code dans lequel il est déclaré |
Portée de procédure | Disponible pour tout le code dans la procédure dans laquelle il est déclaré |
Portée de module | Disponible pour tout le code dans le module, la classe ou la structure dans lesquels il est déclaré |
Portée d’espace de noms | Disponible pour tout le code dans l’espace de noms dans lequel il est déclaré |
Ces niveaux de portée vont du plus petit (bloc) au plus grand (espace de noms), où la portée la plus petite signifie le plus petit ensemble de code pouvant faire référence à l’élément sans qualification. Pour plus d’informations, consultez « Niveaux de portée » dans cette page.
Spécification de la portée et définition de variables
Vous spécifiez la portée d’un élément lorsque vous le déclarez. La portée peut dépendre des facteurs suivants :
La région (bloc, procédure, module, classe ou structure) dans laquelle vous déclarez l’élément
L’espace de noms contenant la déclaration de l’élément
Le niveau d’accès que vous déclarez pour l’élément
Faites attention lorsque vous définissez des variables portant le même nom, mais avec une portée différente, car cela peut entraîner des résultats inattendus. Pour plus d'informations, consultez References to Declared Elements.
Niveaux de portée
Un élément de programmation est disponible dans toute la région dans laquelle vous le déclarez. Tout le code de la même région peut faire référence à l’élément sans qualifier son nom.
Portée de bloc
Un bloc est un ensemble d’instructions compris dans des instructions de déclaration de début et de fin, telles que les suivantes :
Do
etLoop
For
[Each
] etNext
If
etEnd If
Select
etEnd Select
SyncLock
etEnd SyncLock
Try
etEnd Try
While
etEnd While
With
etEnd With
Si vous déclarez une variable dans un bloc, vous pouvez l’utiliser uniquement dans ce bloc. Dans l’exemple suivant, la portée de la variable d’entier cube
est le bloc compris entre If
et End If
, et vous ne pouvez plus faire référence à cube
lorsque l’exécution passe hors du bloc.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Notes
Même si la portée d’une variable est limitée à un bloc, sa durée de vie reste quand même celle de la procédure entière. Si vous entrez le bloc plusieurs fois au cours de la procédure, chaque variable de bloc conserve sa valeur précédente. Pour éviter des résultats inattendus dans ce cas précis, il est judicieux d’initialiser des variables de bloc au début du bloc.
Portée de procédure
Un élément déclaré dans une procédure n’est pas disponible en dehors de cette procédure. Seule la procédure qui contient la déclaration peut l’utiliser. Les variables de ce niveau sont également appelées variables locales. Vous les déclarez avec l’instruction Dim, avec ou sans le mot clé Static.
La portée de procédure et la portée de bloc sont étroitement liées. Si vous déclarez une variable dans une procédure, mais en dehors d’un bloc au sein de cette procédure, vous pouvez considérer la variable comme ayant une portée de bloc, où le bloc est la procédure toute entière.
Notes
Tous les éléments locaux, même s’il s’agit de variables Static
, sont privés dans la procédure dans laquelle ils apparaissent. Vous ne pouvez déclarer aucun élément avec le mot clé Public dans une procédure.
Portée de module
Pour des raisons pratiques, le seul terme niveau de module s’applique tout autant aux modules qu’aux classes et aux structures. Vous pouvez déclarer des éléments à ce niveau en plaçant l’instruction de déclaration à l’extérieur de toute procédure ou de tout bloc, mais à l’intérieur du module, de la classe ou de la structure.
Lorsque vous effectuez une déclaration au niveau du module, le niveau d’accès que vous choisissez détermine la portée. L’espace de noms qui contient le module, la classe ou la structure affecte également la portée.
Les éléments pour lesquels vous déclarez le niveau d’accès Private sont disponibles pour chaque procédure de ce module, mais ne sont disponibles pour aucun code d’un autre module. L’instruction Dim
au niveau du module est définie par défaut avec la valeur Private
si vous n’utilisez aucun mot clé de niveau d’accès. Toutefois, vous pouvez rendre la portée et le niveau d’accès plus évidents en utilisant le mot clé Private
dans l’instruction Dim
.
Dans l’exemple suivant, toutes les procédures définies dans le module peuvent faire référence à la variable de chaîne strMsg
. Lorsque la deuxième procédure est appelée, elle affiche le contenu de la variable de chaîne strMsg
dans une boîte de dialogue.
' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
MsgBox(strMsg)
End Sub
Portée d’espace de noms
Si vous déclarez un élément au niveau du module avec le mot clé Friend ou Public, il devient disponible pour toutes les procédures de l’espace de noms dans lequel l’élément est déclaré. Avec la modification suivante apportée à l’exemple précédent, la variable de chaîne strMsg
peut être référencée par le code n’importe où dans l’espace de noms de sa déclaration.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
La portée d’espace de noms comprend des espaces de noms imbriqués. Un élément disponible à partir d’un espace de noms est également disponible à partir de n’importe quel espace de noms imbriqué à l’intérieur de cet espace de noms.
Si votre projet ne contient pas d’instruction Namespace, tous les éléments du projet se trouvent dans le même espace de noms. Dans ce cas, la portée d’espace de noms peut être considérée comme une portée de projet. Les éléments Public
d’un module, d’une classe ou d’une structure sont également disponibles pour tout projet faisant référence à leur projet.
Choix de la portée
Lorsque vous déclarez une variable, vous devez garder à l’esprit les points suivants lorsque vous choisissez sa portée.
Avantages des variables locales
Les variables locales sont un bon choix pour tout type de calcul temporaire pour les raisons suivantes :
Éviter les conflits de noms. Les noms des variables locales n’entraînent pas de conflit. Par exemple, vous pouvez créer plusieurs procédures différentes contenant une variable appelée
intTemp
. Tant que chaqueintTemp
est déclaré en tant que variable locale, chaque procédure reconnaît uniquement sa propre version deintTemp
. Toute procédure peut modifier la valeur dans sonintTemp
local sans affecter les variablesintTemp
des autres procédures.Consommation de mémoire. Les variables locales consomment de la mémoire uniquement pendant l’exécution de leur procédure. Leur mémoire est libérée lorsque la procédure retourne au code appelant. En revanche, les variables Shared et Static consomment des ressources de mémoire jusqu’à ce que votre application cesse de s’exécuter, donc utilisez-les uniquement si nécessaire. Les variables d’instance consomment de la mémoire tant que leur instance continue d’exister, ce qui les rend moins efficaces que les variables locales, mais potentiellement plus efficaces que les variables
Shared
ouStatic
.
Réduction de la portée
En général, lors de la déclaration d’une variable ou d’une constante, il est recommandé de rendre la portée aussi petite que possible (la portée de bloc est la plus petite). Cela permet de conserver la mémoire et de réduire les risques que votre code fasse référence par erreur à la mauvaise variable. De même, vous devez déclarer une variable Static seulement s’il est nécessaire de conserver sa valeur entre les appels de procédure.