Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’étendue d’un élément déclaré est l’ensemble de tout le code qui peut faire référence à celui-ci sans qualifier son nom ni le rendre disponible via une instruction Imports (espace de noms et type.NET). Un élément peut avoir une étendue à l’un des niveaux suivants :
Niveau | Descriptif |
---|---|
Étendue de bloc | Disponible uniquement dans le bloc de code dans lequel il est déclaré |
Étendue de la procédure | Disponible pour tout le code dans la procédure dans laquelle il est déclaré |
Étendue du module | Disponible pour tout le code dans le module, la classe ou la structure dans laquelle il est déclaré |
Étendue de l’espace de noms | Disponible pour tout le code dans l’espace de noms dans lequel il est déclaré |
Ces niveaux de progression de l’étendue du plus étroit (bloc) au plus large (espace de noms), où l’étendue la plus étroite signifie le plus petit ensemble de code qui peut faire référence à l’élément sans qualification. Pour plus d’informations, consultez « Niveaux d’étendue » sur cette page.
Spécification de l’étendue et de la définition des variables
Vous spécifiez l’étendue d’un élément lorsque vous le déclarez. L’étendue peut dépendre des facteurs suivants :
Région (bloc, procédure, module, classe ou structure) dans laquelle vous déclarez l’élément
Espace de noms contenant la déclaration de l’élément
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 une étendue différente, car cela peut entraîner des résultats inattendus. Pour plus d’informations, consultez Références aux éléments déclarés.
Niveaux d’étendue
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.
Étendue de bloc
Un bloc est un ensemble d’instructions placées dans des instructions de lancement et de fin de déclaration, 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, l’étendue de la variable cube
entière est le bloc 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
Remarque
Même si l’étendue d’une variable est limitée à un bloc, sa durée de vie est toujours celle de l’ensemble de la procédure. Si vous entrez le bloc plusieurs fois pendant la procédure, chaque variable de bloc conserve sa valeur précédente. Pour éviter les résultats inattendus dans ce cas, il est judicieux d’initialiser des variables de bloc au début du bloc.
Étendue de la 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 à ce niveau sont également appelées variables locales. Vous les déclarez avec l’instruction Dim, avec ou sans le mot clé static .
La procédure et l’étendue de bloc sont étroitement liées. Si vous déclarez une variable à l’intérieur d’une procédure, mais en dehors d’un bloc dans cette procédure, vous pouvez considérer la variable comme ayant une étendue de bloc, où le bloc est la procédure entière.
Remarque
Tous les éléments locaux, même s’ils sont Static
des variables, sont privés de la procédure dans laquelle ils apparaissent. Vous ne pouvez déclarer aucun élément à l’aide du mot clé Public dans une procédure.
Étendue du module
Pour des raisons pratiques, le niveau de module à terme unique s’applique également aux modules, aux classes et aux structures. Vous pouvez déclarer des éléments à ce niveau en plaçant l’instruction de déclaration en dehors de n’importe quelle procédure ou bloc, mais dans le module, la classe ou la structure.
Lorsque vous effectuez une déclaration au niveau du module, le niveau d’accès que vous choisissez détermine l’étendue. L’espace de noms qui contient le module, la classe ou la structure affecte également l’étendue.
Les éléments pour lesquels vous déclarez le niveau d’accès privé sont disponibles pour chaque procédure de ce module, mais pas pour aucun code d’un autre module. L’instruction Dim
au niveau du module est par défaut Private
si vous n’utilisez aucun mot clé de niveau d’accès. Toutefois, vous pouvez rendre l’étendue et le niveau d’accès plus évidents en utilisant le Private
mot clé dans l’instruction Dim
.
Dans l’exemple suivant, toutes les procédures définies dans le module peuvent faire référence à la variable strMsg
de chaîne. Lorsque la deuxième procédure est appelée, elle affiche le contenu de la variable strMsg
de chaîne 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
Étendue de l’espace de noms
Si vous déclarez un élément au niveau du module à l’aide du 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 de l’exemple précédent, la variable strMsg
de chaîne peut être référencée par du 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
L’étendue de l’espace de noms inclut 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 d’espacede noms, tout ce qui se trouve dans le projet se trouve dans le même espace de noms. Dans ce cas, l’étendue de l’espace de noms peut être considérée comme une étendue de projet.
Public
les éléments d’un module, d’une classe ou d’une structure sont également disponibles pour tous les projets qui référencent leur projet.
Choix de l’étendue
Lorsque vous déclarez une variable, gardez à l’esprit les points suivants lors du choix de son étendue.
Avantages des variables locales
Les variables locales sont un bon choix pour n’importe quel type de calcul temporaire, pour les raisons suivantes :
Évitement des conflits de noms. Les noms de variables locales ne sont pas sensibles aux conflits. Par exemple, vous pouvez créer plusieurs procédures différentes contenant une variable appelée
intTemp
. Tant que chacunintTemp
est déclaré comme variable locale, chaque procédure reconnaît uniquement sa propre version deintTemp
. Toute procédure peut modifier la valeur dans son localintTemp
sans affecter lesintTemp
variables dans d’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 partagées et statiques consomment des ressources mémoire jusqu’à ce que votre application cesse de s’exécuter. Utilisez-les uniquement si nécessaire. Les variables d’instance consomment de la mémoire alors que leur instance continue d’exister, ce qui les rend moins efficaces que les variables locales, mais potentiellement plus efficaces que
Shared
les variables.Static
Réduction de l’étendue
En général, lors de la déclaration d’une variable ou d’une constante, il est recommandé de programmer l’étendue aussi étroite que possible (l’étendue de bloc est la plus étroite). Cela permet de conserver la mémoire et de minimiser les risques de votre code qui fait référence à une variable incorrecte. De même, vous devez déclarer une variable à statique uniquement lorsqu’il est nécessaire de conserver sa valeur entre les appels de procédure.