Share via


Promotion de type (Visual Basic)

Lorsque vous déclarez un élément de programmation dans un module, Visual Basic promeut son étendue à l’espace de noms contenant le module. C’est ce qu’on appelle la promotion de type.

L’exemple suivant montre une définition de squelette d’un module et de deux membres de ce module.

Namespace projNamespace
    Module projModule
        Public Enum basicEnum As Integer
            one = 1
            two = 2
        End Enum
        Public Class innerClass
            Shared Sub numberSub(ByVal firstArg As Integer)
            End Sub
        End Class
    End Module
End Namespace

Dans projModule, les éléments de programmation déclarés au niveau du module sont promus en projNamespace. Dans l’exemple précédent, basicEnum et innerClass sont promus, mais numberSub ne l’est pas, car ils ne sont pas déclarés au niveau du module.

Effet de la promotion de type

L’effet de la promotion de type est qu’une chaîne de qualification n’a pas besoin d’inclure le nom du module. L’exemple suivant effectue deux appels à la procédure dans l’exemple précédent.

Sub usePromotion()
    projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
    projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub

Dans l’exemple précédent, le premier appel utilise des chaînes de qualification complètes. Toutefois, cela n’est pas nécessaire en raison de la promotion de type. Le deuxième appel accède également aux membres du module sans inclure projModule dans les chaînes de qualification.

Effet de la promotion de type

Si l’espace de noms a déjà un membre portant le même nom qu’un membre de module, la promotion de type est rejetée pour ce membre de module. L’exemple suivant montre une définition de squelette d’une énumération et d’un module dans le même espace de noms.

Namespace thisNamespace
    Public Enum abc
        first = 1
        second
    End Enum
    Module thisModule
        Public Class abc
            Public Sub abcSub()
            End Sub
        End Class
        Public Class xyz
            Public Sub xyzSub()
            End Sub
        End Class
    End Module
End Namespace

Dans l’exemple précédent, Visual Basic ne peut pas promouvoir la classe abc vers thisNameSpace , car il existe déjà une énumération portant le même nom au niveau de l’espace de noms. Pour accéder à abcSub, vous devez utiliser la chaîne thisNamespace.thisModule.abc.abcSub de qualification complète. Toutefois, la classe xyz est toujours promue et vous pouvez accéder à xyzSub avec la chaîne thisNamespace.xyz.xyzSub de qualification plus courte.

Échec de la promotion de type pour les types partiels

Si une classe ou une structure à l’intérieur d’un module utilise le mot clé partielle, la promotion de type est automatiquement annulée pour cette classe ou structure, que l’espace de noms ait ou non un membre portant le même nom. D’autres éléments du module sont toujours éligibles pour la promotion de type.

Conséquences. L’échec de la promotion de type d’une définition partielle peut entraîner des résultats inattendus et même des erreurs de compilateur. L’exemple suivant montre des définitions partielles de squelette d’une classe, dont l’une se trouve à l’intérieur d’un module.

Namespace sampleNamespace
    Partial Public Class sampleClass
        Public Sub sub1()
        End Sub
    End Class
    Module sampleModule
        Partial Public Class sampleClass
            Public Sub sub2()
            End Sub
        End Class
    End Module
End Namespace

Dans l’exemple précédent, le développeur peut s’attendre à ce que le compilateur fusionne les deux définitions partielles de sampleClass. Toutefois, le compilateur ne prend pas en compte la promotion de la définition partielle dans sampleModule. Par conséquent, il tente de compiler deux classes distinctes et distinctes, toutes deux nommées sampleClass, mais avec des chemins de qualification différents.

Le compilateur fusionne des définitions partielles uniquement lorsque leurs chemins qualifiés complets sont identiques.

Recommandations

Les recommandations suivantes représentent une bonne pratique de programmation.

  • Noms uniques. Lorsque vous avez un contrôle total sur le nommage des éléments de programmation, il est toujours judicieux d’utiliser des noms uniques partout. Les noms identiques nécessitent une qualification supplémentaire et peuvent rendre votre code plus difficile à lire. Ils peuvent également entraîner des erreurs subtiles et des résultats inattendus.

  • Qualification complète. Lorsque vous travaillez avec des modules et d’autres éléments dans le même espace de noms, l’approche la plus sûre consiste à toujours utiliser la qualification complète pour tous les éléments de programmation. Si la promotion de type est rejetée pour un membre de module et que vous ne qualifiez pas pleinement ce membre, vous pouvez accéder par inadvertance à un autre élément de programmation.

Voir aussi