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 deklarált elem hatóköre az összes olyan kód halmaza, amely a nevének minősítése nélkül hivatkozhat rá, vagy egy importutasításon (.NET-névtéren és típuson) keresztül elérhetővé teheti. Egy elem hatóköre a következő szintek egyikén lehet:
szint | Leírás |
---|---|
Hatókör letiltása | Csak abban a kódblokkban érhető el, amelyben deklarálva van |
Eljárás hatóköre | A deklarált eljáráson belül az összes kód számára elérhető |
Modul hatóköre | Minden kód elérhető abban a modulban, osztályban vagy struktúrában, amelyben deklarálva van |
Névtér hatóköre | A névtérben lévő összes kód számára elérhető, amelyben deklarálva van |
Ezek a hatókörszintek a legszűkebbtől (blokktól) a legszélesebbig (névtérig) haladnak, ahol a legszűkebb hatókör azt a legkisebb kódkészletet jelenti, amely minősítés nélkül hivatkozhat az elemre. További információ: "Hatókör szintjei" ezen a lapon.
Hatókör megadása és változók definiálása
Deklarálásakor meg kell adnia egy elem hatókörét. A hatókör a következő tényezőktől függhet:
Az a régió (blokk, eljárás, modul, osztály vagy struktúra), amelyben deklarálja az elemet
Az elem deklarációját tartalmazó névtér
Az elemhez deklarált hozzáférési szint
Ügyeljen arra, hogy azonos nevű, de eltérő hatókörű változókat definiáljon, mert ez váratlan eredményekhez vezethet. További információ: Deklarált elemekre mutató hivatkozások.
Hatókör szintjei
Egy programozási elem az egész régióban elérhető, amelyben deklarálja. Az ugyanabban a régióban lévő összes kód a nevének minősítése nélkül hivatkozhat az elemre.
Blokk hatókör
Egy blokk egy utasítássorozat, amely kezdeti és záró deklarációs utasításokba van foglalva, például a következők:
Do
ésLoop
For
[Each
] ésNext
If
ésEnd If
Select
ésEnd Select
SyncLock
ésEnd SyncLock
Try
ésEnd Try
While
ésEnd While
With
ésEnd With
Ha egy blokkon belül deklarál egy változót, azt csak abban a blokkban használhatja. Az alábbi példában az egész szám változó cube
hatóköre a If
és End If
közötti blokk, és már nem hivatkozhat a(z) cube
változóra, amikor a végrehajtás kilép a blokkból.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Megjegyzés:
Még akkor is, ha egy változó hatóköre egy blokkra korlátozódik, élettartama még mindig a teljes eljáráshoz tartozik. Ha az eljárás során többször adja meg a blokkot, minden blokkváltozó megőrzi a korábbi értékét. Az ilyen esetek váratlan eredményeinek elkerülése érdekében érdemes inicializálni a blokkváltozókat a blokk elején.
Eljárás hatóköre
Az eljáráson belül deklarált elem ezen eljáráson kívül nem érhető el. Csak a deklarációt tartalmazó eljárás használhatja. Az ezen a szinten lévő változókat helyi változóknak is nevezik. A dim utasítással deklarálhatja őket statikus kulcsszóval vagy anélkül.
Az eljárás és a blokk hatóköre szorosan összefügg. Ha egy változót egy eljáráson belül deklarál, de az eljárás bármely blokkja kívül esik, a változó blokkhatókörrel rendelkezik, ahol a blokk a teljes eljárás.
Megjegyzés:
Minden helyi elem, még ha Static
változók is, privátak a megjelenítési eljáráshoz. A nyilvános kulcsszóval nem deklarálhat semmilyen elemet egy eljáráson belül.
Modul hatóköre
A kényelem érdekében az egykifejezéses modulszint egyformán vonatkozik a modulokra, osztályokra és struktúrákra. Az elemek ezen a szinten deklarálhatók úgy, hogy a deklarálási utasítást bármilyen eljáráson vagy blokkon kívül, de a modulon, osztályon vagy struktúrán belül helyezi el.
Amikor deklarációt készít a modul szintjén, a választott hozzáférési szint határozza meg a hatókört. A modult, osztályt vagy struktúrát tartalmazó névtér a hatókörre is hatással van.
Azok az elemek, amelyekhez privát hozzáférési szintet deklarál, a modul minden eljárása számára elérhetők, egy másik modulban lévő kódhoz azonban nem. Ha Dim
nem használ hozzáférési szintű kulcsszavakat, a modulszintű utasítás alapértelmezés szerint Private
az lesz. A hatókört és a hozzáférési szintet azonban nyilvánvalóbbá teheti az Private
utasításban szereplő Dim
kulcsszóval.
Az alábbi példában a modulban definiált összes eljárás hivatkozhat a sztringváltozóra strMsg
. A második eljárás meghívásakor megjeleníti a sztringváltozó strMsg
tartalmát egy párbeszédpanelen.
' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
MsgBox(strMsg)
End Sub
Névtér hatóköre
Ha modulszinten deklarál egy elemet a Barát vagy a Nyilvános kulcsszó használatával, az az elem deklarálásához használt névtérben minden eljárás számára elérhetővé válik. Az előző példában az alábbi módosítással a sztringváltozó strMsg
kóddal hivatkozható a deklaráció névterében.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
A névtér hatóköre beágyazott névtereket tartalmaz. A névtéren belülről elérhető elem az adott névtérbe ágyazott bármely névtérből is elérhető.
Ha a projekt nem tartalmaz névtérutasítást, a projekt minden része ugyanabban a névtérben van. Ebben az esetben a névtér hatóköre projekthatókörnek tekinthető.
Public
egy modul, osztály vagy struktúra elemei bármely projekt számára elérhetők, amelyek a projektjükre hivatkoznak.
Hatókör kiválasztása
Amikor deklarál egy változót, a hatókör kiválasztásakor tartsa szem előtt az alábbi szempontokat.
A helyi változók előnyei
A helyi változók bármilyen ideiglenes számításhoz jó választásnak számítanak, az alábbi okokból:
Névütközés elkerülése. A helyi változónevek nem érzékenyek az ütközésre. Létrehozhat például több különböző eljárást, amelyek egy úgynevezett
intTemp
változót tartalmaznak. Mindaddig, amíg mindegyikintTemp
helyi változóként van deklarálva, minden eljárás csak a saját verziójátintTemp
ismeri fel. Bármely eljárás megváltoztathatja a helyiintTemp
értékeket anélkül, hogyintTemp
más eljárások változóit befolyásolná.Memóriahasználat. A helyi változók csak akkor használnak memóriát, ha az eljárásuk fut. A memória felszabadul, amikor az eljárás visszatér a hívó kódhoz. Ezzel szemben a megosztott és statikus változók addig használják a memóriaerőforrásokat, amíg az alkalmazás nem fut, ezért csak akkor használják őket, ha szükséges. A példányváltozók memóriát használnak fel, miközben a példányuk továbbra is létezik, ami kevésbé hatékony, mint a helyi változók, de akár hatékonyabbak is lehetnek, mint
Shared
aStatic
változók.
Hatókör minimalizálása
A változók vagy állandók deklarálásakor általában jó programozási gyakorlat, hogy a hatókör a lehető legszűkebb legyen (a blokk hatóköre a legszűkebb). Ez segít megőrizni a memóriát, és minimalizálni annak az esélyét, hogy a kód hibásan hivatkozik a hibás változóra. Hasonlóképpen, egy változót csak akkor kell statikusnak minősíteni, ha meg kell őriznie az értékét az eljáráshívások között.