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 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ű projekten ListBoxProject
belül definiál egy objektumot, a végrehajtható fájl ListBoxProject.exe egy úgynevezett ListBoxProject
né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 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 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 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, 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