Megosztás a következőn keresztül:


Névterek a Visual Basicben

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:

Képernyőkép két névtérhierarchiáról.

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

Lásd még