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.