Delen via


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 ListBoxmaakt, 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:

Screenshot that shows two namespace hierarchies.

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 ListBoxProjectdefinieert, 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 Assemb1en 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 ConsoleApplication1heeft, 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.StringBuildergeven. Voor een project met de naam ConsoleApplication1krijgt u verwijzingen naar toegang System.TextConsoleApplication1.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

Zie ook