Namnområden i Visual Basic

Namnområden organiserar de objekt som definierats i en sammansättning. Sammansättningar kan innehålla flera namnområden, som i sin tur kan innehålla andra namnområden. Namnområden förhindrar tvetydighet och förenklar referenser när du använder stora grupper av objekt, till exempel klassbibliotek.

.NET Framework definierar ListBox till exempel klassen i System.Windows.Forms namnområdet. Följande kodfragment visar hur du deklarerar en variabel med det fullständigt kvalificerade namnet för den här klassen:

Dim LBox As System.Windows.Forms.ListBox

Undvika namnkollisioner

.NET Framework-namnområden löser ett problem som ibland kallas namnområdesförorening, där utvecklaren av ett klassbibliotek hindras av att liknande namn används i ett annat bibliotek. Dessa konflikter med befintliga komponenter kallas ibland namnkollisioner.

Om du till exempel skapar en ny klass med namnet ListBoxkan du använda den i projektet utan kvalificering. Men om du vill använda .NET Framework-klassen ListBox i samma projekt måste du använda en fullständigt kvalificerad referens för att göra referensen unik. Om referensen inte är unik genererar Visual Basic ett fel som anger att namnet är tvetydigt. Följande kodexempel visar hur du deklarerar dessa objekt:

' 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

Följande bild visar två namnområdeshierarkier som båda innehåller ett objekt med namnet ListBox:

Screenshot that shows two namespace hierarchies.

Som standard innehåller varje körbar fil som du skapar med Visual Basic ett namnområde med samma namn som projektet. Om du till exempel definierar ett objekt i ett projekt med namnet ListBoxProjectinnehåller den körbara filen ListBoxProject.exe ett namnområde med namnet ListBoxProject.

Flera sammansättningar kan använda samma namnområde. Visual Basic behandlar dem som en enda uppsättning namn. Du kan till exempel definiera klasser för ett namnområde som heter SomeNameSpace i en sammansättning med namnet Assemb1och definiera ytterligare klasser för samma namnområde från en sammansättning med namnet Assemb2.

Fullständigt kvalificerade namn

Fullständigt kvalificerade namn är objektreferenser som är prefix med namnet på namnområdet där objektet definieras. Du kan använda objekt som definierats i andra projekt om du skapar en referens till klassen (genom att välja Lägg till referens från Projekt-menyn ) och sedan använda det fullständigt kvalificerade namnet för objektet i koden. Följande kodfragment visar hur du använder det fullständigt kvalificerade namnet för ett objekt från ett annat projekts namnområde:

Dim LBC As New ListBoxProject.Form1.ListBox

Fullständigt kvalificerade namn förhindrar namngivningskonflikter eftersom de gör det möjligt för kompilatorn att avgöra vilket objekt som används. Men själva namnen kan bli långa och besvärliga. För att komma runt detta kan du använda -instruktionen Imports för att definiera ett alias – ett förkortat namn som du kan använda i stället för ett fullständigt kvalificerat namn. I följande kodexempel skapas till exempel alias för två fullständigt kvalificerade namn och dessa alias används för att definiera två objekt.

Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox

Om du använder -instruktionen Imports utan ett alias kan du använda alla namn i det namnområdet utan kvalificering, förutsatt att de är unika för projektet. Om projektet innehåller Imports instruktioner för namnområden som innehåller objekt med samma namn måste du fullständigt kvalificera det namnet när du använder det. Anta till exempel att projektet innehöll följande två Imports instruktioner:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Om du försöker använda Class1 det utan att kvalificera det, genererar Visual Basic ett fel som anger att namnet Class1 är tvetydigt.

Namnområdesnivåinstruktioner

I ett namnområde kan du definiera objekt som moduler, gränssnitt, klasser, ombud, uppräkningar, strukturer och andra namnområden. Du kan inte definiera objekt som egenskaper, procedurer, variabler och händelser på namnområdesnivå. Dessa objekt måste deklareras i containrar, till exempel moduler, strukturer eller klasser.

Globalt nyckelord i fullständigt kvalificerade namn

Om du har definierat en kapslad hierarki med namnområden kan kod i hierarkin blockeras från att System komma åt namnområdet för .NET Framework. I följande exempel visas en hierarki där SpecialSpace.System namnområdet blockerar åtkomsten till 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  

Det innebär att Visual Basic-kompilatorn inte kan matcha referensen till System.Int32, eftersom SpecialSpace.System den inte definierar Int32. Du kan använda nyckelordet Global för att starta kvalificeringskedjan på den yttersta nivån i .NET Framework-klassbiblioteket. På så sätt kan du ange System namnområdet eller något annat namnområde i klassbiblioteket. I följande exempel visas detta.

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  

Du kan använda Global för att komma åt andra namnområden på rotnivå, till exempel , och alla namnområden som Microsoft.VisualBasicär associerade med projektet.

Globalt nyckelord i namnområdesinstruktioner

Du kan också använda nyckelordet Global i en namnområdesinstruktor. På så sätt kan du definiera ett namnområde från projektets rotnamnområde.

Alla namnområden i projektet baseras på projektets rotnamnområde. Visual Studio tilldelar projektnamnet som standardrotnamnområde för all kod i projektet. Om projektet till exempel heter ConsoleApplication1tillhör dess programmeringselement namnområdet ConsoleApplication1. Om du deklarerar Namespace Magnetospherekommer referenser till Magnetosphere i projektet att komma åt ConsoleApplication1.Magnetosphere.

I följande exempel används nyckelordet Global för att deklarera ett namnområde från rotnamnområdet för projektet.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

I en namnområdesdeklaration Global kan inte kapslas i ett annat namnområde.

Du kan använda programsidan, Projektdesignern (Visual Basic) för att visa och ändra projektets rotnamnområde . För nya projekt är rotnamnområdet som standard namnet på projektet. Om du vill orsaka Global att det är namnområdet på den översta nivån kan du rensa posten Rotnamnområde så att rutan är tom. Om du rensar rotnamnområdet tar du bort behovet av nyckelordet Global i namnområdesdeklarationer.

Om en Namespace instruktion deklarerar ett namn som också är ett namnområde i .NET Framework blir .NET Framework-namnområdet otillgängligt om nyckelordet Global inte används i ett fullständigt kvalificerat namn. Om du vill aktivera åtkomst till .NET Framework-namnområdet utan att använda nyckelordet Global kan du inkludera nyckelordet Global i -instruktionen Namespace .

I följande exempel finns nyckelordet Global i namnområdesdeklarationen System.Text .

Om nyckelordet Global inte fanns i namnområdesdeklarationen StringBuilder kunde du inte komma åt det utan att Global.System.Text.StringBuilderange . För ett projekt med namnet ConsoleApplication1skulle referenser till System.Text komma åt ConsoleApplication1.System.Text om nyckelordet Global inte användes.

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

Se även