Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A névterek rendszerezik a szerelvényben definiált objektumokat. Az assembly-k több névteret is tartalmazhatnak, amelyek hierarchikusan 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 ListBox osztályt 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
A .NET-keretrendszer névterei olyan problémát oldanak meg, amelyet néha névtérszennyezésnek is 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 azt szabadon használhatja 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 ListBoxobjektumot 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ű projekten ListBoxProjectbelül definiál egy objektumot, a végrehajtható fájl ListBoxProject.exe egy úgynevezett ListBoxProjectnévteret tartalmaz.
Több assembly 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 SomeNameSpace nevű névtérhez, amelyeket egy Assemb1 nevű szerelvényben, illetve további osztályokat ugyanahhoz a névtérhez egy Assemb2 nevű szerelvényben hívhat meg.
Teljesen megadott nevek
A teljesen minősített nevek olyan objektumhivatkozások, amelyek az objektumot definiáló névtér nevével vannak előtaggal ellátva. 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 a nevet használatkor 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ó a teljesen minősített nevekben
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 SpecialSpace.System névtér blokkolja a System hozzáférést.
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ást 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ának 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
Az Global egyebek mellett más gyökérszintű névterek, például Microsoft.VisualBasic, valamint a projekthez társított bármely névtér elérésére is használható.
Globális kulcsszó a névtér-utasításokban
A kulcsszót egy Globalné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 ConsoleApplication1tartoznak. Ha deklarálja a Namespace Magnetosphere, a projektben lévő Magnetosphere hivatkozások hozzáférhetnek a ConsoleApplication1.Magnetosphere-hez.
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 Designer (Visual Basic) segítségével megtekintheti és módosíthatja a projekt gyökérnévterét . Új projektek esetén a Root Namespace alapértelmezés szerint a projektnév. A Global névtér legfelső szintre helyezéséhez törölje a gyökérnévtér bejegyzést, 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 deklaráció olyan nevet deklarál, amely szintén névtér a .NET-keretrendszerben, akkor a .NET-keretrendszer névtere elérhetetlenné válik, ha a Global kulcsszót nem használják teljesen minősített névként. Ha a kulcsszó használata nélkül szeretné engedélyezni a Global .NET-keretrendszer névteréhez való hozzáférést, a kulcsszót belefoglalhatja az GlobalNamespace 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, akkor csak StringBuilder megadásával lehet hozzáférni Global.System.Text.StringBuilder-hez. Egy ConsoleApplication1 nevű projekt esetében a hivatkozások System.Text az ConsoleApplication1.System.Text-t érhetik el, ha a Global kulcsszót nem használná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