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


Hatókör a Visual Basicben

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 és Loop

  • For [Each] és Next

  • If és End If

  • Select és End Select

  • SyncLock és End SyncLock

  • Try és End Try

  • While és End While

  • With és End 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 intTempváltozót tartalmaznak. Mindaddig, amíg mindegyik intTemp helyi változóként van deklarálva, minden eljárás csak a saját verzióját intTempismeri fel. Bármely eljárás megváltoztathatja a helyi intTemp értékeket anélkül, hogy intTemp 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 a Static 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.

Lásd még