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 Staticdeklariert worden wäre, würden die vorherigen angesammelten Werte bei Aufrufen von runningTotalnicht 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.

Weitere Informationen