Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Lorsque vous déclarez un élément de programmation dans un module, Visual Basic promeut son étendue à l’espace de noms contenant le module. Il s’agit de la promotion de type.
L’exemple suivant montre une définition squelette d’un module et 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 à projNamespace. Dans l’exemple précédent, basicEnum et innerClass sont promus, mais numberSub ce n’est pas le cas, car il n’est pas déclaré 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 de 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.
Échec de la promotion de type
Si l’espace de noms possède déjà un membre portant le même nom qu’un membre de module, la promotion de type est annulée pour ce membre de module. L’exemple suivant montre une définition 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 car thisNameSpace 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 de qualification complète thisNamespace.thisModule.abc.abcSub. Toutefois, la classe xyz est toujours promue et vous pouvez accéder à xyzSub avec la chaîne de qualification plus courte thisNamespace.xyz.xyzSub.
É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é Partial , 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 à la promotion de type.
Conséquences. La défaite de la promotion de type d’une définition partielle peut entraîner des résultats inattendus et même des erreurs du compilateur. L’exemple suivant montre des définitions partielles squelettes 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 à l’intérieur de sampleModule. Par conséquent, il tente de compiler deux classes distinctes et distinctes, nommées sampleClass mais avec des chemins de qualification différents.
Le compilateur fusionne les définitions partielles uniquement lorsque leurs chemins complets sont identiques.
Recommandations
Les recommandations suivantes représentent de bonnes pratiques 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 une qualification complète pour tous les éléments de programmation. Si la promotion de type est défaite pour un membre de module et que vous ne qualifiez pas entièrement ce membre, vous pouvez accéder par inadvertance à un autre élément de programmation.