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 ListBox
kan 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
:
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 ListBoxProject
innehå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 Assemb1
och 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 ConsoleApplication1
tillhör dess programmeringselement namnområdet ConsoleApplication1
. Om du deklarerar Namespace Magnetosphere
kommer 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.StringBuilder
ange . För ett projekt med namnet ConsoleApplication1
skulle 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