Lebensdauer in Visual Basic
Die Lebensdauer eines deklarierten Elements ist der Zeitraum, in dem es zur Verwendung verfügbar ist. Variablen sind die einzigen Elemente, die eine Lebensdauer aufweisen. Zu diesem Zweck behandelt der Compiler Prozedurparameter und Funktionsrückgaben als Sonderfälle von Variablen. Die Lebensdauer einer Variablen stellt den Zeitraum dar, in dem ein Wert enthalten sein kann. Der Wert kann sich während der Lebensdauer ändern, aber es ist immer ein Wert enthalten.
Unterschiedliche Lebensdauern
Eine Membervariable (deklariert auf Modulebene, außerhalb einer Prozedur) hat in der Regel dieselbe Lebensdauer wie das Element, in dem es deklariert wird. Eine nicht freigegebene Variable, die in einer Klasse oder Struktur deklariert ist, ist als separate Kopie für jede Instanz der Klasse oder Struktur vorhanden, in der sie deklariert wird. Jede solche Variable hat dieselbe Lebensdauer wie ihre Instanz. Eine Shared
-Variable weist jedoch nur eine einzelne Lebensdauer auf, die die gesamte Ausführungszeit der Anwendung andauert.
Eine lokale Variable (innerhalb einer Prozedur deklariert) ist nur vorhanden, während die Prozedur ausgeführt wird, in der sie deklariert wird. Dies gilt auch für die Parameter dieser Prozedur und für alle Funktionsrückgaben. Wenn diese Prozedur jedoch andere Prozeduren aufruft, behalten die lokalen Variablen ihre Werte bei, während die aufgerufenen Prozeduren ausgeführt werden.
Anfang der Lebensdauer
Die Lebensdauer einer lokalen Variablen beginnt, wenn das Steuerelement die Prozedur eingibt, in der sie deklariert wird. Jede lokale Variable wird auf den Standardwert für den Datentyp initialisiert, sobald die Prozedur ausgeführt wird. Wenn die Prozedur auf eine Dim
-Anweisung trifft, die Anfangswerte angibt, legt sie diese Variablen auf diese Werte fest, auch wenn Ihr Code ihnen bereits andere Werte zugewiesen hatte.
Jeder Member einer Strukturvariablen wird so initialisiert, als wäre er eine separate Variable. Entsprechend wird jedes Element einer Arrayvariablen einzeln initialisiert.
Variablen, die in einem Block innerhalb einer Prozedur (z. B. einer For
-Schleife) deklariert werden, werden beim Eintragen in die Prozedur initialisiert. Diese Initialisierungen werden wirksam, unabhängig davon, ob der Code den Block jemals ausführt.
Ende der Lebensdauer
Wenn eine Prozedur beendet wird, bleiben die Werte der lokalen Variablen nicht erhalten, und Visual Basic gibt den von ihnen benötigten Speicher frei. Wenn Sie die Prozedur das nächste Mal aufrufen, werden alle lokalen Variablen neu erstellt und erneut initialisiert.
Wenn eine Instanz einer Klasse oder Struktur beendet wird, verlieren die nicht freigegebenen Variablen ihren Speicherplatz und ihre Werte. Jede neue Instanz der Klasse oder Struktur erstellt und reinitialisiert die nicht freigebenden Variablen. Shared
-Variablen werden jedoch beibehalten, bis die Anwendung nicht mehr ausgeführt wird.
Verlängerung der Lebensdauer
Wenn Sie eine lokale Variable mit dem Static
-Schlüsselwort deklarieren, ist die Lebensdauer länger als die Ausführungszeit der Prozedur. Die folgende Tabelle zeigt, wie die Prozedurdeklaration bestimmt, wie lange eine Static
-Variable vorhanden ist.
Speicherort und Freigabe der Prozedur | Beginn der Lebensdauer einer statischen Variablen | Ende der Lebensdauer einer statischen Variablen |
---|---|---|
In einem Modul (standardmäßig freigegeben) | Beim ersten Aufruf der Prozedur | Wenn die Anwendung nicht mehr ausgeführt wird |
In einer Klasse Shared (Prozedur ist kein Instanzmember) |
Das erste Mal, wenn die Prozedur entweder für eine bestimmte Instanz oder für den Klassen- oder Strukturnamen selbst aufgerufen wird | Wenn die Anwendung nicht mehr ausgeführt wird |
In einer Instanz einer Klasse, nicht Shared (Prozedur ist ein Instanzmember) |
Das erste Mal, wenn die Prozedur für die bestimmte Instanz aufgerufen wird | Wenn die Instanz für die Garbage Collection (GC, automatische Speicherbereinigung) freigegeben wird |
Statische Variablen mit demselben Namen
Sie können statische Variablen mit demselben Namen in mehreren Prozeduren deklarieren. Wenn Sie dies tun, berücksichtigt der Visual Basic-Compiler jede dieser Variablen als separates Element. Die Initialisierung einer dieser Variablen wirkt sich nicht auf die Werte der anderen Variablen aus. Dies gilt auch, wenn Sie eine Prozedur mit einer Reihe von Überladungen definieren und eine statische Variable mit demselben Namen in jeder Überladung deklarieren.
Enthaltende Elemente für statische Variablen
Sie können eine statische lokale Variable innerhalb einer Klasse deklarieren (d. h. innerhalb einer Prozedur in dieser Klasse). Sie können jedoch keine statische lokale Variable innerhalb einer Struktur deklarieren (entweder als Strukturelement oder als lokale Variable einer Prozedur innerhalb dieser Struktur).
Beispiel
Beschreibung
Im folgenden Beispiel wird eine Variable mit dem Schlüsselwort Static deklariert. (Beachten Sie, dass Sie das Dim
-Schlüsselwort nicht benötigen, wenn die Dim-Anweisung einen Modifizierer wie Static
verwendet.)
Code
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Kommentare
Im vorherigen Beispiel ist die Variable applesSold
weiterhin vorhanden, nachdem die Prozedur runningTotal
zum aufrufenden Code zurückkehrt. Beim nächsten Aufruf von runningTotal
behält applesSold
den zuvor berechneten Wert bei.
Wenn applesSold
ohne Verwendung von Static
deklariert worden wäre, würden die vorherigen angesammelten Werte bei Aufrufen von runningTotal
nicht beibehalten werden. Beim nächsten Aufruf von runningTotal
wäre applesSold
neu erstellt und auf 0 initialisiert worden, und runningTotal
hätte einfach denselben Wert zurückgegeben, der für den Aufruf verwendet wurde.
Kompilieren des Codes
Sie können den Wert einer statischen lokalen Variablen als Teil der Deklaration initialisieren. Wenn Sie ein Array als Static
deklarieren, können Sie den Rang (Anzahl der Dimensionen), die Länge jeder Dimension und die Werte der einzelnen Elemente initialisieren.
Sicherheit
Im vorherigen Beispiel können Sie dieselbe Lebensdauer festlegen, indem Sie applesSold
auf Modulebene deklarieren. Wenn Sie den Bereich einer Variablen auf diese Weise geändert haben, hat die Prozedur jedoch keinen exklusiven Zugriff mehr darauf. Da andere Prozeduren auf applesSold
zugreifen und den Wert ändern können, kann die laufende Summe unzuverlässig sein, und die Verwaltung des Codes gestaltet sich schwieriger.