Élettartam a Visual Basicben
A deklarált elem élettartama az az időtartam, amely alatt felhasználható. A változók az egyetlen olyan elem, amely élettartamával rendelkezik. Ebből a célból a fordító az eljárásparamétereket és a függvényeket a változók különleges eseteiként kezeli. A változó élettartama azt az időtartamot jelöli, amely alatt az érték tárolható. Az értéke az élettartama során változhat, de mindig tartalmaz valamilyen értéket.
Különböző élettartamok
A tagváltozók (modulszinten deklarálva, bármely eljáráson kívül) általában ugyanazt az élettartamot használják, mint a deklarált elem. Egy osztályban vagy struktúrában deklarált nem tagolt változó külön példányként létezik annak az osztálynak vagy struktúrának minden példányához, amelyben deklarálva van. Minden ilyen változó élettartama megegyezik a példányával. Egy Shared
változónak azonban csak egyetlen élettartama van, amely az alkalmazás teljes futási idejéig tart.
Egy helyi változó (egy eljáráson belül deklarálva) csak akkor létezik, ha a deklarált eljárás fut. Ez az eljárás paramétereire és a függvény visszatérésére is vonatkozik. Ha azonban az eljárás más eljárásokat hív meg, a helyi változók megtartják az értékeiket, amíg a hívott eljárások futnak.
Élettartam kezdete
A helyi változó élettartama akkor kezdődik, amikor a vezérlőelem belép a deklarált eljárásba. Minden helyi változó inicializálva lesz az adattípus alapértelmezett értékére, amint az eljárás elkezd futni. Amikor az eljárás egy Dim
kezdeti értékeket meghatározó utasítással találkozik, ezeket a változókat ezekre az értékekre állítja, még akkor is, ha a kód már más értékeket rendelt hozzájuk.
A struktúraváltozó minden tagja inicializálva van, mintha külön változó lenne. Hasonlóképpen, a tömbváltozó minden eleme inicializálódik egyenként.
Az eljáráson belüli blokkokban (például For
hurokban) deklarált változók inicializálva lesznek az eljárásba való belépéskor. Ezek az inicializálások érvénybe lépnek, függetlenül attól, hogy a kód végrehajtja-e a blokkot.
Élettartam vége
Amikor egy eljárás leáll, a helyi változók értékei nem maradnak meg, és a Visual Basic visszanyeri a memóriájukat. Amikor legközelebb meghívja az eljárást, az összes helyi változója újra létrejön, és újraindul.
Amikor egy osztály vagy struktúra egy példánya leáll, a nem tagolt változók elveszítik a memóriájukat és az értékeiket. Az osztály vagy struktúra minden új példánya létrehozza és újrainicializálja a nem tagolt változókat. A változók azonban mindaddig megmaradnak, Shared
amíg az alkalmazás nem fut.
Élettartam meghosszabbítása
Ha egy helyi változót deklarál a Static
kulcsszóval, annak élettartama hosszabb, mint az eljárás végrehajtási ideje. Az alábbi táblázat bemutatja, hogyan határozza meg az eljárásdeklaráció, hogy mennyi ideig létezik egy Static
változó.
Eljárás helye és megosztása | A statikus változó élettartama megkezdődik | Statikus változó élettartamának vége |
---|---|---|
Modulban (alapértelmezés szerint megosztva) | Az eljárás első meghívása | Amikor az alkalmazás nem fut |
Osztályban Shared (az eljárás nem példánytag) |
Az eljárás első meghívása egy adott példányon, vagy magában az osztály- vagy struktúranévben | Amikor az alkalmazás nem fut |
Egy osztály egy példányában nem Shared (az eljárás egy példány tagja) |
Az eljárás első meghívása az adott példányon | A példány szemétgyűjtéshez (GC) való kiadásakor |
Azonos nevű statikus változók
Több eljárásban is deklarálhat azonos nevű statikus változókat. Ha ezt teszi, a Visual Basic fordító minden ilyen változót külön elemnek tekint. Az egyik változó inicializálása nem befolyásolja a többi értékeket. Ugyanez vonatkozik arra az esetre, ha túlterhelések halmazával definiál egy eljárást, és minden túlterhelésben azonos nevű statikus változót deklarál.
Statikus változók elemeit tartalmazza
Egy statikus helyi változót deklarálhat egy osztályon belül, vagyis az osztály egy eljárásán belül. Azonban nem deklarálhat statikus helyi változót egy struktúrán belül, sem struktúratagként, sem az adott struktúrán belüli eljárás helyi változójaként.
Példa
Leírás
Az alábbi példa egy statikus kulcsszóval rendelkező változót deklarál. (Vegye figyelembe, hogy nincs szüksége a Dim
kulcsszóra, ha a Dim utasítás módosítót használ, például Static
.)
Kód
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Megjegyzések
Az előző példában a változó applesSold
továbbra is létezik, miután az eljárás runningTotal
visszatér a hívó kódhoz. A következő alkalommal runningTotal
a rendszer applesSold
megtartja a korábban kiszámított értékét.
Ha applesSold
használat Static
nélkül lett volna deklarálva, akkor az előző halmozott értékek nem maradnának meg a hívásban runningTotal
. A következő híváskor runningTotal
újra létre lett volna hozva és applesSold
0-ra inicializálva lett volna, és runningTotal
egyszerűen visszaadta volna ugyanazt az értéket, amellyel meghívták.
A kód fordítása
A statikus helyi változó értékét inicializálhatja a deklaráció részeként. Ha tömböt Static
deklarál, inicializálhatja annak rangját (dimenziók számát), az egyes dimenziók hosszát és az egyes elemek értékeit.
Biztonság
Az előző példában ugyanazt az élettartamot a modul szintjén deklarálva applesSold
állíthatja elő. Ha azonban így módosította egy változó hatókörét, az eljárás már nem rendelkezik kizárólagos hozzáféréssel. Mivel más eljárások hozzáférhetnek applesSold
és módosíthatják az értékét, a futó összeg megbízhatatlan lehet, és a kód karbantartása nehezebb lehet.