Partager via


Guide pratique pour masquer une variable portant le même nom que votre variable (Visual Basic)

Vous pouvez masquer une variable en l’ombrant , c’est-à-dire en la redéfinissant avec une variable du même nom. Vous pouvez masquer la variable de deux façons :

  • Masquage par étendue. Vous pouvez masquer par l'étendue en la re-déclarant à l’intérieur d’une sous-région de la région contenant la variable que vous souhaitez masquer.

  • Masquage par héritage. Si la variable que vous souhaitez masquer est définie au niveau de la classe, vous pouvez l’ombrer par héritage en la déclarant avec le mot clé Shadows dans une classe dérivée.

Deux façons de masquer une variable

Pour masquer une variable par masquage par l’étendue

  1. Déterminez la région qui définit la variable que vous souhaitez masquer et déterminez une sous-région dans laquelle la redéfinir avec votre variable.

    Région de la variable Sous-région autorisée pour la redéfinir
    Module Classe au sein du module
    classe Sous-classe dans la classe

    Procédure au sein de la classe

    Vous ne pouvez pas redéfinir une variable de procédure dans un bloc au sein de cette même procédure, par exemple dans une construction If...End If ou une boucle For.

  2. Créez la sous-région s’il n’existe pas déjà.

  3. Dans la sous-région, écrivez une déclaration Dim déclarant la variable d’ombre.

    Lorsque le code à l’intérieur de la sous-région fait référence au nom de la variable, le compilateur résout la référence à la variable d’ombre.

    L’exemple suivant illustre le masquage par l'étendue, ainsi qu'une référence qui contourne le masquage.

    Module shadowByScope
        ' The following statement declares num as a module-level variable.
        Public num As Integer
        Sub show()
            ' The following statement declares num as a local variable.
            Dim num As Integer
            ' The following statement sets the value of the local variable.
            num = 2
            ' The following statement displays the module-level variable.
            MsgBox(CStr(shadowByScope.num))
        End Sub
        Sub useModuleLevelNum()
            ' The following statement sets the value of the module-level variable.
            num = 1
            show()
        End Sub
    End Module
    

    L’exemple précédent déclare la variable num au niveau du module et au niveau de la procédure (dans la procédure show). La variable num locale ombre la variable num au niveau du module dans show, de sorte que la variable locale est définie sur 2. Toutefois, il n’existe aucune variable locale à ombrer num dans la useModuleLevelNum procédure. Par conséquent, useModuleLevelNum définit la valeur de la variable au niveau du module sur 1.

    L'appel MsgBox à l'intérieur show contourne le mécanisme de masquage en qualifiant num avec le nom du module. Par conséquent, elle affiche la variable au niveau du module au lieu de la variable locale.

Pour masquer une variable en la masquant par héritage

  1. Vérifiez que la variable que vous souhaitez masquer est déclarée dans une classe et au niveau de la classe (en dehors de toute procédure). Sinon, vous ne pouvez pas la masquer par héritage.

  2. Définissez une classe dérivée de la classe de la variable si elle n’existe pas déjà.

  3. À l’intérieur de la classe dérivée, écrivez une Dim instruction déclarant votre variable. Incluez le mot clé Shadows dans la déclaration.

    Lorsque le code de la classe dérivée fait référence au nom de la variable, le compilateur résout la référence à votre variable.

    L'exemple suivant illustre le masquage par héritage. Cela fait deux références, une qui accède à la variable de masquage et une qui contourne le masquage.

    Public Class shadowBaseClass
        Public shadowString As String = "This is the base class string."
    End Class
    Public Class shadowDerivedClass
        Inherits shadowBaseClass
        Public Shadows shadowString As String = "This is the derived class string."
        Public Sub showStrings()
            Dim s As String = "Unqualified shadowString: " & shadowString &
                 vbCrLf & "MyBase.shadowString: " & MyBase.shadowString
            MsgBox(s)
        End Sub
    End Class
    

    L’exemple précédent déclare la variable shadowString dans la classe de base et l’ombre dans la classe dérivée. La procédure showStrings de la classe dérivée affiche la version d’ombre de la chaîne lorsque le nom shadowString n’est pas qualifié. Il affiche ensuite la version ombrée lorsqu’elle shadowString est qualifiée avec le MyBase mot clé.

Programmation robuste

L’ombre introduit plusieurs versions d’une variable portant le même nom. Lorsqu’une instruction de code fait référence au nom de la variable, la version à laquelle le compilateur résout la référence dépend de facteurs tels que l’emplacement de l’instruction de code et la présence d’une chaîne éligible. Cela peut augmenter le risque de faire référence à une version involontaire d’une variable ombrée. Vous pouvez réduire ce risque en qualifiant entièrement toutes les références à une variable masquée.

Voir aussi