Partager via


Étendue en Visual Basic

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 et Loop

  • For [Each] et Next

  • If et End If

  • Select et End Select

  • SyncLock et End SyncLock

  • Try et End Try

  • While et End While

  • With et End 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 strMsgde 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 chacun intTemp est déclaré comme variable locale, chaque procédure reconnaît uniquement sa propre version de intTemp. Toute procédure peut modifier la valeur dans son local intTemp sans affecter les intTemp 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.

Voir aussi