Espaces de noms dans Visual Basic
Les espaces de noms permettent d’organiser les objets définis dans un assembly. Les assemblys peuvent contenir plusieurs espaces de noms, qui peuvent à leur tour contenir d’autres espaces de noms. Les espaces de noms permettent d’éviter les ambiguïtés et de simplifier les références quand de grands groupes d’objets, tels que des bibliothèques de classes, sont utilisés.
Par exemple, .NET Framework définit la classe ListBox dans l’espace de noms System.Windows.Forms. Le fragment de code suivant montre comment déclarer une variable en utilisant le nom qualifié complet de cette classe :
Dim LBox As System.Windows.Forms.ListBox
Éviter les collisions de noms
Les espaces de noms .NET Framework permettent de résoudre un problème parfois appelé pollution d’espace de noms, où le développeur d’une bibliothèque de classes est gêné par l’utilisation de noms similaires dans une autre bibliothèque. Ces conflits avec des éléments existants sont également connus sous le terme de collisions de noms.
Par exemple, si vous créez une classe nommée ListBox
, vous pouvez l’utiliser dans votre projet sans qualification. Toutefois, si vous souhaitez utiliser la classe .NET Framework ListBox dans le même projet, vous devez utiliser une référence qualifiée complète pour rendre la référence unique. Si la référence n’est pas unique, Visual Basic génère une erreur indiquant que le nom est ambigu. L’exemple de code suivant montre comment déclarer ces objets :
' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox
L’illustration ci-dessous montre deux hiérarchies d’espaces de noms, chacune contenant un objet nommé ListBox
:
Par défaut, chaque fichier exécutable que vous créez à l’aide de Visual Basic contient un espace de noms portant le même nom que votre projet. Par exemple, si vous définissez un objet dans un projet nommé ListBoxProject
, le fichier exécutable, ListBoxProject.exe, contient un espace de noms appelé ListBoxProject
.
Plusieurs assemblys peuvent utiliser le même espace de noms. Visual Basic les traite alors comme un ensemble unique de noms. Par exemple, vous pouvez définir des classes pour un espace de noms appelé SomeNameSpace
dans un assembly nommé Assemb1
, et définir des classes supplémentaires pour le même espace de noms d’un assembly nommé Assemb2
.
noms qualifiés complets
Les noms qualifiés complets sont des références d’objet dont le préfixe est le nom de l’espace de noms dans lequel l’objet est défini. Vous pouvez utiliser les objets définis dans d’autres projets si vous créez une référence à la classe (en choisissant Ajouter une référence dans le menu Projet ), puis utiliser le nom qualifié complet de l’objet dans votre code. Le fragment de code suivant montre comment utiliser le nom qualifié complet d’un objet provenant de l’espace de noms d’un autre projet :
Dim LBC As New ListBoxProject.Form1.ListBox
Les noms qualifiés complets empêchent les conflits de nommage, car ils permettent au compilateur d’identifier l’objet utilisé. Toutefois, les noms peuvent devenir longs et compliqués. Pour contourner ce problème, utilisez l’instruction Imports
pour définir un alias, qui est un nom abrégé utilisable à la place d’un nom qualifié complet. L’exemple de code ci-dessous crée les alias de deux noms qualifiés complets, puis utilise ces alias pour définir deux objets.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
Si vous utilisez l’instruction Imports
sans alias, vous pouvez vous servir de tous les noms de l’espace de noms sans qualification, à condition qu’ils soient uniques au sein du projet. Si votre projet contient des instructions Imports
pour les espaces de noms contenant des éléments de même nom, vous devez fournir un nom qualifié complet quand vous l’utilisez. Imaginons, par exemple, que votre projet contient les deux instructions Imports
suivantes :
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Si vous essayez d’utiliser Class1
sans fournir son nom qualifié complet, Visual Basic génère une erreur indiquant que le nom Class1
est ambigu.
Instructions au niveau de l’espace de noms
Dans un espace de noms, vous pouvez définir des éléments tels que des modules, des interfaces, des classes, des délégués, des énumérations, des structures et d’autres espaces de noms. Vous ne pouvez pas définir d’éléments tels que des propriétés, des procédures, des variables et des événements au niveau de l’espace de noms. Ces éléments doivent être déclarés dans des conteneurs tels que des modules, des structures ou des classes.
Mot clé Global dans les noms qualifiés complets
Si vous avez défini une hiérarchie imbriquée d’espaces de noms, le code à l’intérieur de cette hiérarchie peut ne pas avoir accès à l’espace de noms System de .NET Framework. L’exemple suivant illustre une hiérarchie dans laquelle l’espace de noms SpecialSpace.System
bloque l’accès à System.
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As System.Int32
Dim n As System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
Le compilateur Visual Basic ne peut donc pas résoudre la référence à System.Int32, car SpecialSpace.System
ne définit pas Int32
. Vous pouvez utiliser le mot clé Global
pour démarrer la chaîne de qualification au niveau le plus externe de la bibliothèque de classes du .NET Framework. Cela vous permet de spécifier l’espace de noms System ou un autre espace de noms dans la bibliothèque de classes. L'exemple suivant illustre ce comportement.
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As Global.System.Int32
Dim n As Global.System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
Utilisez aussi Global
pour accéder à d’autres espaces de noms à la racine, tels que Microsoft.VisualBasic, et aux espaces de noms associés à votre projet.
Mot clé Global dans les instructions Namespace
Vous pouvez également utiliser le mot clé Global
dans une Namespace Statement. pour définir un espace de noms hors de l’espace de noms racine de votre projet.
Tous les espaces de noms dans votre projet sont basés sur l’espace de noms racine du projet. Visual Studio définit le nom de votre projet comme espace de noms racine par défaut pour l’ensemble du code de votre projet. Par exemple, si votre projet est nommé ConsoleApplication1
, ses éléments de programmation appartiennent à l’espace de noms ConsoleApplication1
. Si vous déclarez Namespace Magnetosphere
, les références à Magnetosphere
dans le projet doivent accéder à ConsoleApplication1.Magnetosphere
.
Les exemples suivants utilisent le mot clé Global
pour déclarer un espace de noms hors de l’espace de noms racine du projet.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
Dans une déclaration d’espace de noms, Global
ne peut pas être imbriqué dans un autre espace de noms.
Vous pouvez utiliser la Application Page, Project Designer (Visual Basic) pour afficher et modifier l’ espace de noms racine du projet. Pour les nouveaux projets, l’ espace de noms racine correspond par défaut au nom du projet. Pour définir Global
comme espace de noms de premier niveau, effacez l’entrée Espace de noms racine pour que la zone soit vide. Quand l’entrée Espace de noms racine est effacée, vous n’avez pas besoin de spécifier le mot clé Global
dans les déclarations d’espace de noms.
Si une instruction Namespace
déclare un nom qui est également un espace de noms dans le .NET Framework, l’espace de noms .NET Framework n’est plus disponible si le mot clé Global
n’est pas utilisé dans un nom qualifié complet. Pour permettre l’accès à cet espace de noms .NET Framework sans utiliser le mot clé Global
, ajoutez le mot clé Global
dans l’instruction Namespace
.
Dans l’exemple suivant, le mot clé Global
est utilisé dans la déclaration d’espace de noms System.Text
.
En l’absence du mot clé Global
dans la déclaration d’espace de noms, l’accès à StringBuilder n’est pas possible sans spécifier Global.System.Text.StringBuilder
. Pour un projet nommé ConsoleApplication1
, les références à System.Text
accèdent à ConsoleApplication1.System.Text
si le mot clé Global
n’est pas utilisé.
Module Module1
Sub Main()
Dim encoding As New System.Text.TitanEncoding
' If the namespace defined below is System.Text
' instead of Global.System.Text, then this statement
' causes a compile-time error.
Dim sb As New System.Text.StringBuilder
End Sub
End Module
Namespace Global.System.Text
Class TitanEncoding
End Class
End Namespace