Freigeben über


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 die Lebensdauer aufweisen. Zu diesem Zweck behandelt der Compiler Prozedurparameter und Funktionswerte als Sonderfälle von Variablen. Die Lebensdauer einer Variablen stellt den Zeitraum dar, in dem ein Wert gespeichert werden kann. Sein Wert kann sich während seiner Lebensdauer ändern, aber er behält immer einen Wert.

Verschiedene 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 freigabefähige 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 verfügt jedoch nur über eine einzelne Lebensdauer, die für die gesamte Ausführung der Anwendung dauert.

Eine lokale Variable (innerhalb einer Prozedur deklariert) ist nur vorhanden, während die Prozedur, in der sie deklariert wird, ausgeführt 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.

Jedes Element einer Strukturvariable wird initialisiert, als wäre es eine separate Variable. Entsprechend wird jedes Element einer Arrayvariable einzeln initialisiert.

Variablen, die innerhalb eines Blocks innerhalb einer Prozedur (z. B. einer For Schleife) deklariert sind, werden beim Eintrag 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 ihren Speicher zurück. 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 gemeinsamen Variablen ihren Arbeitsspeicher 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 Die Lebensdauer der statischen Variable beginnt. Ende der statischen Variablenlebensdauer
In einem Modul (standardmäßig freigegeben) Das erste Mal, wenn die Prozedur aufgerufen wird 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 solche Variable 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.)

Programmcode

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 an den aufrufenden Code zurückgegeben wurde. Wenn runningTotal das nächste Mal aufgerufen wird, behält applesSold seinen zuvor berechneten Wert bei.

Wenn applesSold ohne Verwendung Staticdeklariert worden wäre, würden die vorherigen angesammelten Werte nicht über Aufrufe runningTotalhinweg beibehalten werden. Das nächste Mal, wenn runningTotal aufgerufen wurde, wäre applesSold neu erstellt und auf 0 initialisiert worden, und runningTotal hätte einfach denselben Wert zurückgegeben, mit dem es aufgerufen wurde.

Kompilieren des Codes

Sie können den Wert einer statischen lokalen Variablen als Teil der Deklaration initialisieren. Wenn Sie ein Array als array Staticdeklarieren, 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 erzeugen, indem Sie auf Modulebene deklarieren applesSold . 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.

Siehe auch