Névterek a Visual Basicben
A névterek rendszerezik a szerelvényben definiált objektumokat. A szerelvények több névteret is tartalmazhatnak, amelyek más névtereket is tartalmazhatnak. A névterek megakadályozzák a kétértelműséget, és leegyszerűsítik a hivatkozásokat nagy objektumcsoportok, például osztálytárak használatakor.
A .NET-keretrendszer például meghatározza az osztályt ListBox a System.Windows.Forms névtérben. Az alábbi kódrészlet bemutatja, hogyan deklarálhat egy változót az osztály teljes neve alapján:
Dim LBox As System.Windows.Forms.ListBox
Névütközések elkerülése
.NET-keretrendszer névterek olyan problémát oldanak meg, amelyet más néven névtérszennyezésnek neveznek, amelyben az osztálykódtár fejlesztőjét akadályozza a hasonló nevek használata egy másik könyvtárban. Ezeket a meglévő összetevőkkel való ütközéseket névütközéseknek is nevezik.
Ha például létrehoz egy új osztályt, ListBox
akkor minősítés nélkül használhatja azt a projekten belül. Ha azonban ugyanabban a projektben szeretné használni a .NET-keretrendszer ListBox osztályt, a hivatkozás egyedivé tétele érdekében teljes mértékben minősített hivatkozást kell használnia. Ha a hivatkozás nem egyedi, a Visual Basic hibát okoz, amely azt jelzi, hogy a név nem egyértelmű. Az alábbi példakód bemutatja, hogyan deklarálhatja ezeket az objektumokat:
' 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
Az alábbi ábrán két névtérhierarchia látható, amelyek mindegyike egy elnevezett ListBox
objektumot tartalmaz:
Alapértelmezés szerint a Visual Basic használatával létrehozott összes végrehajtható fájl tartalmaz egy olyan névteret, amelynek neve megegyezik a projekt nevével. Ha például egy nevű ListBoxProject
projekten belül definiál egy objektumot, a végrehajtható fájl ListBoxProject.exe tartalmaz egy úgynevezett ListBoxProject
névteret.
Több szerelvény is használhatja ugyanazt a névteret. A Visual Basic egyetlen névkészletként kezeli őket. Definiálhat például osztályokat egy névtérhez, amelyet egy nevesített Assemb1
szerelvényben hívhat SomeNameSpace
meg, és további osztályokat definiálhat ugyanahhoz a névtérhez egy nevesített Assemb2
szerelvényből.
Teljes névvel rendelkező nevek
A teljes név olyan objektumhivatkozások, amelyek előtaggal rendelkeznek annak a névtérnek a nevével, amelyben az objektum definiálva van. Más projektekben definiált objektumokat akkor használhat, ha az osztályra mutató hivatkozást hoz létre (a Projekt menü Hivatkozás hozzáadása parancsával), majd használja a kódban szereplő objektum teljes nevét. Az alábbi kódrészlet bemutatja, hogyan használható egy objektum teljes neve egy másik projekt névteréből:
Dim LBC As New ListBoxProject.Form1.ListBox
A teljesen minősített nevek megakadályozzák az elnevezési ütközéseket, mivel lehetővé teszik a fordító számára, hogy meghatározza, melyik objektumot használja. Maguk a nevek azonban hosszúak és nehézkesek lehetnek. Ennek megkerüléséhez az Imports
utasítással definiálhat egy aliast – egy rövidített nevet, amelyet teljes név helyett használhat. Az alábbi példakód például aliasokat hoz létre két teljesen minősített névhez, és két objektum definiálásához használja ezeket az aliasokat.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
Ha az Imports
utasítást alias nélkül használja, a névtérben lévő összes nevet minősítés nélkül használhatja, feltéve, hogy azok egyediek a projektben. Ha a projekt olyan névterekre vonatkozó utasításokat tartalmaz Imports
, amelyek azonos nevű elemeket tartalmaznak, akkor ezt a nevet a használat során teljes mértékben meg kell jelölnie. Tegyük fel például, hogy a projekt a következő két Imports
utasítást tartalmazta:
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
Ha a teljes jogosultság nélkül próbálja meg használni Class1
, a Visual Basic hibát okoz, amely azt jelzi, hogy a név Class1
nem egyértelmű.
Névtérszintű utasítások
A névtérben definiálhat olyan elemeket, mint a modulok, interfészek, osztályok, meghatalmazottak, számbavételek, struktúrák és egyéb névterek. A névtér szintjén nem definiálhat elemeket, például tulajdonságokat, eljárásokat, változókat és eseményeket. Ezeket az elemeket tárolókban, például modulokban, struktúrákban vagy osztályokban kell deklarálni.
Globális kulcsszó teljes névvel
Ha a névterek beágyazott hierarchiáját definiálta, előfordulhat, hogy a hierarchián belüli kód nem fér hozzá a System .NET-keretrendszer névteréhez. Az alábbi példa egy olyan hierarchiát mutat be, amelyben a névtér letiltja a SpecialSpace.System
hozzáférést.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
Ennek eredményeképpen a Visual Basic fordító nem tudja sikeresen feloldani a hivatkozását System.Int32, mert SpecialSpace.System
nem definiálja Int32
. A kulcsszóval Global
elindíthatja a minősítési láncot a .NET-keretrendszer osztálykönyvtár legkülső szintjén. Ez lehetővé teszi a System névtér vagy bármely más névtér megadását az osztálytárban. Az alábbi példa ezt szemlélteti.
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
Más gyökérszintű névterek, például Microsoft.VisualBasica projekthez társított névterek elérésére is használhatóGlobal
.
Globális kulcsszó a névtér-utasításokban
A kulcsszót egy Global
névtérutasításban is használhatja. Ez lehetővé teszi, hogy a projekt gyökérnévterén kívül definiáljon egy névteret.
A projekt összes névtere a projekt gyökérnévterén alapul. A Visual Studio a projekt összes kódjához alapértelmezett gyökérnévtérként rendeli hozzá a projekt nevét. Ha például a projekt neve el van nevezve ConsoleApplication1
, a programozási elemei a névtérhez ConsoleApplication1
tartoznak. Ha deklarálja Namespace Magnetosphere
, a projektben lévő hivatkozások Magnetosphere
hozzáférhetnek ConsoleApplication1.Magnetosphere
.
Az alábbi példák a Global
kulcsszó használatával deklarálnak egy névteret a projekt gyökérnévteréből.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
Névtér-deklarációban Global
nem ágyazható be más névtérbe.
Az alkalmazáslap, a Project Tervező (Visual Basic) használatával megtekintheti és módosíthatja a projekt gyökérnévterét. Új projektek esetén a gyökérnévtér alapértelmezés szerint a projektnév. A legfelső szintű névtér létrehozásához Global
törölje a gyökérnévtér bejegyzését, hogy a mező üres legyen. A gyökérnévtér törlése eltávolítja a kulcsszó szükségességét a Global
névtér-deklarációkban.
Ha egy Namespace
utasítás olyan nevet deklarál, amely szintén névtér a .NET-keretrendszer, akkor a .NET-keretrendszer névtér elérhetetlenné válik, ha a Global
kulcsszót nem használják teljes névvel. Ha a kulcsszó használata Global
nélkül szeretné engedélyezni az adott .NET-keretrendszer névtérhez való hozzáférést, a kulcsszót belefoglalhatja az Global
Namespace
utasításba.
Az alábbi példában a Global
kulcsszó szerepel a System.Text
névtér deklarációjában.
Ha a Global
kulcsszó nem szerepel a névtér deklarációjában, nem érhető el anélkül, StringBuilder hogy megadná.Global.System.Text.StringBuilder
Egy nevesített ConsoleApplication1
projekt esetében a hivatkozásokat akkor System.Text
érheti el ConsoleApplication1.System.Text
, ha a Global
kulcsszót nem használják.
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