Naamruimten in Visual Basic
Naamruimten organiseren de objecten die zijn gedefinieerd in een assembly. Assembly's kunnen meerdere naamruimten bevatten, die op hun beurt andere naamruimten kunnen bevatten. Naamruimten voorkomen dubbelzinnigheid en vereenvoudigen verwijzingen bij het gebruik van grote groepen objecten, zoals klassebibliotheken.
Het .NET Framework definieert bijvoorbeeld de ListBox klasse in de System.Windows.Forms naamruimte. In het volgende codefragment ziet u hoe u een variabele declareert met behulp van de volledig gekwalificeerde naam voor deze klasse:
Dim LBox As System.Windows.Forms.ListBox
Naamconflicten voorkomen
.NET Framework-naamruimten verhelpen een probleem dat ook wel naamruimtevervuiling wordt genoemd, waarbij de ontwikkelaar van een klassebibliotheek wordt belemmerd door het gebruik van vergelijkbare namen in een andere bibliotheek. Deze conflicten met bestaande onderdelen worden ook wel naamconflicten genoemd.
Als u bijvoorbeeld een nieuwe klasse met de naam ListBox
maakt, kunt u deze zonder kwalificatie in uw project gebruiken. Als u echter de .NET Framework-klasse ListBox in hetzelfde project wilt gebruiken, moet u een volledig gekwalificeerde verwijzing gebruiken om de verwijzing uniek te maken. Als de verwijzing niet uniek is, genereert Visual Basic een fout waarin wordt aangegeven dat de naam niet eenduidig is. In het volgende codevoorbeeld ziet u hoe u deze objecten declareert:
' 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
In de volgende afbeelding ziet u twee naamruimtehiërarchieën, beide met een object met de naam ListBox
:
Standaard bevat elk uitvoerbaar bestand dat u maakt met Visual Basic een naamruimte met dezelfde naam als uw project. Als u bijvoorbeeld een object in een project met de naam ListBoxProject
definieert, bevat het uitvoerbare bestand ListBoxProject.exe een naamruimte met de naam ListBoxProject
.
Meerdere assembly's kunnen dezelfde naamruimte gebruiken. Visual Basic behandelt deze als één set namen. U kunt bijvoorbeeld klassen definiëren voor een naamruimte die wordt aangeroepen SomeNameSpace
in een assembly met de naam Assemb1
en aanvullende klassen definiëren voor dezelfde naamruimte van een assembly met de naam Assemb2
.
Volledig gekwalificeerde namen
Volledig gekwalificeerde namen zijn objectverwijzingen die worden voorafgegaan door de naam van de naamruimte waarin het object is gedefinieerd. U kunt objecten gebruiken die zijn gedefinieerd in andere projecten als u een verwijzing naar de klasse maakt (door Verwijzing toevoegen te kiezen in het menu Project) en vervolgens de volledig gekwalificeerde naam voor het object in uw code te gebruiken. In het volgende codefragment ziet u hoe u de volledig gekwalificeerde naam gebruikt voor een object uit de naamruimte van een ander project:
Dim LBC As New ListBoxProject.Form1.ListBox
Volledig gekwalificeerde namen voorkomen naamconflicten omdat ze het mogelijk maken voor de compiler om te bepalen welk object wordt gebruikt. De namen zelf kunnen echter lang en lastig worden. U kunt dit omzeilen door de Imports
instructie te gebruiken om een alias te definiëren: een verkorte naam die u kunt gebruiken in plaats van een volledig gekwalificeerde naam. In het volgende codevoorbeeld worden bijvoorbeeld aliassen gemaakt voor twee volledig gekwalificeerde namen en worden deze aliassen gebruikt om twee objecten te definiëren.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
Als u de Imports
instructie zonder alias gebruikt, kunt u alle namen in die naamruimte zonder kwalificatie gebruiken, mits ze uniek zijn voor het project. Als uw project instructies bevat Imports
voor naamruimten die items met dezelfde naam bevatten, moet u die naam volledig kwalificeren wanneer u het gebruikt. Stel dat uw project de volgende twee Imports
instructies bevat:
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Als u probeert te gebruiken Class1
zonder deze volledig in aanmerking te komen, genereert Visual Basic een fout waarin wordt aangegeven dat de naam Class1
niet eenduidig is.
Instructies voor naamruimteniveau
Binnen een naamruimte kunt u items definiëren zoals modules, interfaces, klassen, gemachtigden, opsommingen, structuren en andere naamruimten. U kunt geen items zoals eigenschappen, procedures, variabelen en gebeurtenissen definiëren op naamruimteniveau. Deze items moeten worden gedeclareerd binnen containers, zoals modules, structuren of klassen.
Globaal trefwoord in volledig gekwalificeerde namen
Als u een geneste hiërarchie van naamruimten hebt gedefinieerd, kan de toegang tot de System naamruimte van het .NET Framework mogelijk worden geblokkeerd door code in die hiërarchie. In het volgende voorbeeld ziet u een hiërarchie waarin de naamruimte de SpecialSpace.System
toegang blokkeert 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
Als gevolg hiervan kan de Visual Basic-compiler de verwijzing naar System.Int32, omdat SpecialSpace.System
deze niet is gedefinieerd, niet worden omgezet Int32
. U kunt het Global
trefwoord gebruiken om de kwalificatieketen te starten op het buitenste niveau van de .NET Framework-klassebibliotheek. Hiermee kunt u de System naamruimte of een andere naamruimte in de klassebibliotheek opgeven. In het volgende voorbeeld ziet u dit.
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
U kunt Global
toegang krijgen tot andere naamruimten op hoofdniveau, zoals Microsoft.VisualBasicen elke naamruimte die aan uw project is gekoppeld.
Globaal trefwoord in naamruimte-instructies
U kunt het Global
trefwoord ook gebruiken in een naamruimte-instructie. Hiermee kunt u een naamruimte definiëren buiten de hoofdnaamruimte van uw project.
Alle naamruimten in uw project zijn gebaseerd op de hoofdnaamruimte voor het project. Visual Studio wijst uw projectnaam toe als de standaardhoofdnaamruimte voor alle code in uw project. Als uw project bijvoorbeeld een naam ConsoleApplication1
heeft, behoren de programmeerelementen ervan tot de naamruimte ConsoleApplication1
. Als u declareert Namespace Magnetosphere
, hebben verwijzingen naar Magnetosphere
in het project toegang ConsoleApplication1.Magnetosphere
.
In de volgende voorbeelden wordt het Global
trefwoord gebruikt om een naamruimte uit de hoofdnaamruimte voor het project te declareren.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
In een naamruimtedeclaratie Global
kan niet worden genest in een andere naamruimte.
U kunt de toepassingspagina, Projectontwerper (Visual Basic) gebruiken om de hoofdnaamruimte van het project weer te geven en te wijzigen. Voor nieuwe projecten wordt de naam van de hoofdnaamruimte standaard ingesteld op de projectnaam. Als u de naamruimte op het hoogste niveau wilt maken Global
, kunt u de vermelding Van de hoofdnaamruimte wissen, zodat het vak leeg is. Als u de hoofdnaamruimte wist, hoeft het Global
trefwoord niet meer in naamruimtedeclaraties te worden opgenomen.
Als een Namespace
instructie een naam declareert die ook een naamruimte in .NET Framework is, is de .NET Framework-naamruimte niet meer beschikbaar als het Global
trefwoord niet wordt gebruikt in een volledig gekwalificeerde naam. Als u toegang tot die .NET Framework-naamruimte wilt inschakelen zonder het Global
trefwoord te gebruiken, kunt u het Global
trefwoord opnemen in de Namespace
instructie.
Het volgende voorbeeld bevat het Global
trefwoord in de System.Text
naamruimtedeclaratie.
Als het Global
trefwoord niet aanwezig was in de naamruimtedeclaratie, StringBuilder kan het niet worden geopend zonder op te Global.System.Text.StringBuilder
geven. Voor een project met de naam ConsoleApplication1
krijgt u verwijzingen naar toegang System.Text
ConsoleApplication1.System.Text
als het Global
trefwoord niet is gebruikt.
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