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


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, ListBoxakkor 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 ListBoxobjektumot tartalmaz:

Screenshot that shows two namespace hierarchies.

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ű ListBoxProjectprojekten belül definiál egy objektumot, a végrehajtható fájl ListBoxProject.exe tartalmaz egy úgynevezett ListBoxProjectné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 Assemb1szerelvényben hívhat SomeNameSpace meg, és további osztályokat definiálhat ugyanahhoz a névtérhez egy nevesített Assemb2szerelvé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 ConsoleApplication1tartoznak. 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 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, nem érhető el anélkül, StringBuilder hogy megadná.Global.System.Text.StringBuilder Egy nevesített ConsoleApplication1projekt 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

Lásd még