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 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, 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 chaque intTemp est déclaré en tant que variable locale, chaque procédure reconnaît uniquement sa propre version de intTemp. Toute procédure peut modifier la valeur dans son intTemp local sans affecter les variables intTemp 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 ou Static.

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.

Voir aussi