Dim-Anweisung (Visual Basic)

Deklariert Speicherplatz für eine oder mehrere Variablen und ordnet ihn zu.

Syntax

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

Bestandteile

  • attributelist

    Optional. Siehe Attributliste.

  • accessmodifier

    Optional. Dabei kann es sich um eine der folgenden Methoden handeln:

    Siehe Access levels in Visual Basic.

  • Shared

    Optional. Siehe Shared.

  • Shadows

    Optional. Siehe Shadows.

  • Static

    Optional. Siehe Static.

  • ReadOnly

    Optional. Siehe ReadOnly.

  • WithEvents

    Optional. Gibt an, dass es sich um Objektvariablen handelt, die auf Instanzen einer Klasse verweisen, die Ereignisse auslösen können. Siehe WithEvents.

  • variablelist

    Erforderlich. Liste der Variablen, die in dieser Anweisung deklariert werden.

    variable [ , variable ... ]

    Jede variable weist folgende Syntax und Bestandteile auf:

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

    Teil Beschreibung
    variablename Erforderlich. Name der Variable. Siehe Declared Element Names.
    boundslist Optional. Liste der Begrenzungen der einzelnen Dimensionen einer Arrayvariablen.
    New Optional. Erstellt eine neue Instanz der Klasse, wenn die Dim-Anweisung ausgeführt wird.
    datatype Optional. Datentyp der Variable.
    With Optional. Führt die Objektinitialisiererliste ein.
    propertyname Optional. Name einer Eigenschaft in der Klasse, von der Sie eine Instanz erstellen.
    propinitializer Erforderlich nach propertyname =. Ausdruck, der ausgewertet und dem Eigenschaftennamen zugewiesen wird.
    initializer Optional, wenn New nicht angegeben ist. Ausdruck, der ausgewertet und der Variablen zugewiesen wird, wenn sie erstellt wird.

Bemerkungen

Der Visual Basic-Compiler verwendet die Dim-Anweisung, um den Datentyp der Variablen und andere Informationen zu bestimmen (z. B. welcher Code auf die Variable zugreifen kann). Im folgenden Beispiel wird eine Variable zum Speichern eines Integer-Werts deklariert.

Dim numberOfStudents As Integer

Sie können einen beliebigen Datentyp oder den Namen einer Enumeration, Struktur, Klasse oder Schnittstelle angeben.

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

Für einen Verweistyp verwenden Sie das Schlüsselwort New, um eine neue Instanz der vom Datentyp angegebenen Klasse oder Struktur zu erstellen. Bei der Verwendung von New verwenden Sie keinen Initialisiererausdruck. Stattdessen übergeben Sie (sofern erforderlich) Argumente an den Konstruktor der Klasse an, aus der Sie die Variable erstellen.

Dim bottomLabel As New System.Windows.Forms.Label

Sie können eine Variable in einer Prozedur, einem Block, einer Klasse, einer Struktur oder einem Modul deklarieren. Sie können eine Variable nicht in einer Quelldatei, einem Namespace oder einer Schnittstelle deklarieren. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

Eine Variable, die auf Modulebene außerhalb einer Prozedur deklariert wird, ist eine Membervariable oder ein Feld. Innerhalb ihrer Klasse, ihrer Struktur oder ihrem Modul befinden sich Membervariablen im Gültigkeitsbereich. Eine auf Prozedurebene deklarierte Variable ist eine lokale Variable. Lokale Variablen sind nur innerhalb ihrer Prozedur oder ihres Blocks im Gültigkeitsbereich.

Die folgenden Zugriffsmodifizierer werden verwendet, um Variablen außerhalb einer Prozedur zu deklarieren: Public, Protected, Friend, Protected Friend und Private. Weitere Informationen finden Sie unter Zugriffsebenen in Visual Basic.

Das Schlüsselwort Dim ist optional und wird in der Regel weggelassen, wenn Sie einen der folgenden Modifizierer angeben: Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly oder WithEvents.

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Wenn Option Explicit aktiviert ist (Standardeinstellung), erfordert der Compiler eine Deklaration für jede von Ihnen verwendete Variable. Weitere Informationen finden Sie unter Option Explicit-Anweisung.

Angeben eines Anfangswerts

Sie können einer Variablen bei ihrer Erstellung einen Wert zuweisen. Für einen Werttyp verwenden Sie einen Initialisierer, um einen Ausdruck anzugeben, der der Variablen zugewiesen werden soll. Der Ausdruck muss zu einer Konstanten ausgewertet werden, die zur Kompilierzeit berechnet werden kann.

Dim quantity As Integer = 10
Dim message As String = "Just started"

Wenn ein Initialisierer, aber kein Datentyp in einer As-Klausel angegeben ist, wird der Typrückschluss verwendet, um den Datentyp aus dem Initialisierer abzuleiten. Im folgenden Beispiel sind sowohl num1 als auch num2 stark typisiert als „integer“ (ganze Zahl). In der zweiten Deklaration leitet der Typrückschluss den Typ vom Wert 3 ab.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Der Typrückschluss wird auf der Prozedurebene angewendet. Er findet nicht außerhalb einer Prozedur in einer Klasse, einer Struktur, einem Modul oder einer Schnittstelle statt. Weitere Informationen zum Typrückschluss finden Sie unter Option Infer-Anweisung und Lokaler Typrückschluss.

Informationen dazu, was passiert, wenn kein Datentyp oder Initialisierer angegeben wird, finden Sie weiter unten in diesem Thema unter Standarddatentypen und -werte.

Sie können einen Objektinitialisierer verwenden, um Instanzen von benannten und anonymen Typen zu deklarieren. Der folgende Code erstellt eine Instanz einer Student-Klasse und verwendet einen Objektinitialisierer, um Eigenschaften zu initialisieren.

Dim student1 As New Student With {.First = "Michael",
                                  .Last = "Tucker"}

Weitere Informationen zu Objektinitialisierern finden Sie unter Gewusst wie: Deklarieren eines Objekts mithilfe eines Objektinitialisierers, Objektinitialisierer: Benannte und anonyme Typen und Anonyme Typen.

Deklarieren mehrerer Variablen

Sie können mehrere Variablen in einer Deklarationsanweisung deklarieren, indem Sie den Variablennamen für jede Variable und nach jedem Arraynamen Klammern angeben. Mehrere Variablen werden durch Kommas voneinander getrennt.

Dim lastTime, nextTime, allTimes() As Date

Wenn Sie mehr als eine Variable mit einer As-Klausel deklarieren, können Sie keinen Initialisierer für diese Gruppe von Variablen angeben.

Sie können unterschiedliche Datentypen für verschiedene Variablen angeben, indem Sie eine separate As-Klausel für jede deklarierte Variable verwenden. Jede Variable verwendet den Datentyp, der in der ersten As-Klausel nach dem zugehörigen Teil variablename angegeben ist.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double

Arrays

Sie können eine Variable zum Speichern eines Arrays deklarieren, das mehrere Werte enthalten kann. Um anzugeben, dass eine Variable ein Array enthält, fügen Sie direkt nach dem variablename Klammern hinzu. Weitere Informationen zu Arrays finden Sie unter Arrays.

Sie können die Unter- und Obergrenze jeder Dimension eines Arrays angeben. Dazu fügen Sie in den Klammern eine boundslist hinzu. Die boundslist gibt für jede Dimension die Obergrenze und optional die Untergrenze an. Die Untergrenze ist immer Null, unabhängig davon, ob Sie sie angeben oder nicht. Jeder Index kann zwischen Null und der jeweiligen Obergrenze variieren.

Die folgenden beiden Anweisungen sind gleichwertig. Jede Anweisung deklariert ein Array von 21 Integer-Elementen. Wenn Sie auf das Array zugreifen, kann der Index von 0 bis 20 variieren.

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

Die folgende Anweisung deklariert ein zweidimensionales Array vom Typ Double. Das Array verfügt über vier Zeilen (3 + 1) mit jeweils sechs Spalten (5 + 1). Beachten Sie, dass eine Obergrenze den höchsten möglichen Wert für den Index darstellt, nicht die Länge der Dimension. Die Länge der Dimension ist die Obergrenze plus 1.

Dim matrix2(3, 5) As Double

Ein Array kann zwischen 1 und 32 Dimensionen aufweisen.

Sie können alle Begrenzungen in einer Arraydeklaration leer lassen. In diesem Fall verfügt das Array über die von Ihnen angegebene Anzahl von Dimensionen, wird jedoch nicht initialisiert. Es hat den Wert Nothing, bis Sie mindestens einige der Elemente initialisieren. Die Dim-Anweisung muss entweder für alle oder für keine Dimensionen Grenzwerte angeben.

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

Wenn das Array mehr als eine Dimension aufweist, müssen Sie Kommas zwischen den Klammern einfügen, um die Anzahl von Dimensionen anzugeben.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

Sie können ein Array der Länge 0 (Null) deklarieren, indem Sie eine der Dimensionen des Arrays als -1 deklarieren. Eine Variable mit einem Array der Länge 0 weist nicht den Wert Nothing auf. Arrays mit der Länge 0 sind für bestimmte Funktionen der Common Language Runtime (CLR) erforderlich. Wenn Sie versuchen, auf ein solches Array zuzugreifen, tritt eine Laufzeitausnahme auf. Weitere Informationen finden Sie unter Arrays.

Sie können die Werte eines Arrays initialisieren, indem Sie ein Arrayliteral verwenden. Umschließen Sie dazu die Initialisierungswerte mit geschweiften Klammern ({}).

Dim longArray() As Long = {0, 1, 2, 3}

Bei mehrdimensionalen Arrays wird die Initialisierung für die einzelnen separaten Dimensionen in geschweiften Klammern in der äußeren Dimension eingeschlossen. Die Elemente werden in zeilengerichteter Reihenfolge angegeben.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Weitere Informationen zu Arrayliteralen finden Sie unter Arrays.

Standarddatentypen und -werte

Die folgende Tabelle beschreibt die Ergebnisse der verschiedenen Kombinationen der Spezifizierung von Datentyp und Initialisierung in einer Dim-Anweisung.

Datentyp angegeben? Initialisierung angegeben? Beispiel Ergebnis
Nein Nein Dim qty Wenn Option Strict deaktiviert ist (Standardeinstellung), wird die Variable auf Nothing festgelegt.

Wenn Option Strict aktiviert ist, tritt ein Kompilierzeitfehler auf.
Nein Ja Dim qty = 5 Wenn Option Infer aktiviert ist (Standardeinstellung), übernimmt die Variable den Datentyp des Initialisierers. Siehe Lokaler Typrückschluss.

Wenn Option Infer und Option Strict ausgeschaltet sind, nimmt die Variable den Datentyp des Object an.

Wenn Option Infer deaktiviert ist und Option Strict aktiviert ist, tritt ein Kompilierzeitfehler auf.
Ja Nein Dim qty As Integer Die Variable wird auf den Standardwert für den Datentyp initialisiert. Weitere Informationen finden Sie in der Tabelle weiter unten in diesem Abschnitt.
Ja Ja Dim qty As Integer = 5 Wenn der Datentyp der Initialisierung nicht in den angegebenen Datentyp konvertiert werden kann, tritt ein Fehler während der Kompilierung auf.

Wenn Sie einen Datentyp, aber keinen Initialisierer angeben, initialisiert Visual Basic die Variable mit dem Standardwert für den jeweiligen Datentyp. In der folgenden Tabelle sind die Standardinitialisierungswerte aufgeführt.

Datentyp Standardwert
Alle numerischen Typen (einschließlich Byte und SByte) 0
Char Binär 0
Alle Verweistypen (einschließlich Object, String und alle Arrays) Nothing
Boolean False
Date 00:00 Uhr am 1. Januar des Jahrs 1 (01/01/0001 12:00:00 AM)

Jedes Element einer Struktur wird wie eine separate Variable initialisiert. Wenn Sie die Länge eines Arrays deklarieren, seine Elemente aber nicht initialisieren, wird jedes Element wie eine separate Variable initialisiert.

Lebensdauer von statischen lokalen Variablen

Eine lokale Static-Variable hat eine längere Lebensdauer als die Prozedur, in der sie deklariert wird. Die Begrenzungen der Lebensdauer der Variablen hängen davon ab, wo die Prozedur deklariert wird und ob sie freigegeben (Shared) ist.

Prozedurdeklaration Variable wird initialisiert Variable ist nicht mehr vorhanden
In einem Modul Beim ersten Aufruf der Prozedur Wenn die Ausführung des Programms beendet wird
In einer Klasse oder Struktur, die Prozedur ist Shared Beim ersten Aufruf der Prozedur für eine bestimmte Instanz oder für die Klasse oder Struktur selbst Wenn die Ausführung des Programms beendet wird
In einer Klasse oder Struktur, die Prozedur ist nicht Shared Beim ersten Aufruf der Prozedur für eine bestimmte Instanz Wenn die Instanz für die Garbage Collection (GC, automatische Speicherbereinigung) freigegeben wird

Attribute und Modifizierer

Attribute können nur auf Membervariablen angewendet werden, nicht auf lokale Variablen. Ein Attribut enthält ergänzende Informationen zu den Metadaten der Assembly, was für temporären Speicher wie lokale Variablen nicht sinnvoll ist.

Auf Modulebene können Sie den Static-Modifizierer nicht verwenden, um Membervariablen zu deklarieren. Auf Prozedurebene können Sie Shared, Shadows, ReadOnly, WithEvents oder Zugriffsmodifizierer nicht verwenden, um lokale Variablen zu deklarieren.

Sie können festlegen, welcher Code auf eine Variable zugreifen kann, indem Sie einen accessmodifier angeben. Klassen- und Modulmembervariablen (außerhalb einer Prozedur) sind standardmäßig auf privaten Zugriff festgelegt und Strukturmembervariablen standardmäßig auf öffentlichen Zugriff. Sie können ihre Zugriffsebenen mit den Zugriffsmodifizierern anpassen. Sie können keine Zugriffsmodifizierer für lokale Variablen (innerhalb einer Prozedur) verwenden.

Sie können WithEvents nur für Membervariablen angeben, nicht für lokale Variablen innerhalb einer Prozedur. Wenn Sie WithEvents angeben, muss der Datentyp der Variablen ein bestimmter Klassentyp sein, nicht Object. Sie können ein Array nicht mit WithEvents deklarieren. Weitere Informationen zu Ereignissen finden Sie unter Ereignisse.

Hinweis

Code außerhalb einer Klasse, einer Struktur oder eines Moduls muss den Namen einer Membervariablen mit dem Namen dieser Klasse bzw. der Struktur oder des Moduls qualifizieren. Code außerhalb einer Prozedur oder eines Blocks kann nicht auf lokale Variablen innerhalb dieser Prozedur oder dieses Blocks verweisen.

Freigeben von verwalteten Ressourcen

Der .NET Framework-Garbage Collector (GC) gibt verwaltete Ressourcen ohne zusätzliche Codierung Ihrerseits frei. Sie können jedoch die Freigabe bzw. das Verwerfen einer verwalteten Ressource erzwingen, anstatt auf die Ausführung des Garbage Collectors zu warten.

Wenn eine Klasse eine besonders wertvolle und knappe Ressource (z. B. eine Datenbankverbindung oder ein Dateihandle) hält, möchten Sie mit der Bereinigung einer nicht mehr verwendeten Klasseninstanz möglicherweise nicht bis zur nächsten Ausführung der Garbage Collection warten. Eine Klasse kann die IDisposable-Schnittstelle implementieren, um eine Möglichkeit zum Freigeben von Ressourcen vor einer Garbage Collection bereitzustellen. Eine Klasse, die diese Schnittstelle implementiert, macht eine Dispose-Methode verfügbar, die aufgerufen werden kann, um die sofortige Freigabe wertvoller Ressourcen zu erzwingen.

Die Using-Anweisung automatisiert den Prozess des Abrufens einer Ressource, der Ausführung einer Reihe von Anweisungen und der anschließenden Freigabe der Ressource. Die Ressource muss jedoch die IDisposable-Schnittstelle implementieren. Weitere Informationen finden Sie unter using-Anweisung.

Beispiel 1

Im folgenden Beispiel werden Variablen mithilfe der Dim-Anweisung mit verschiedenen Optionen deklariert.

' Declare and initialize a Long variable.
Dim startingAmount As Long = 500

' Declare a local variable that always retains its value,
' even after its procedure returns to the calling code.
Static totalSales As Double

' Declare a variable that refers to an array.
Dim highTemperature(31) As Integer

' Declare and initialize an array variable that
' holds four Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

Beispiel 2

Das folgende Beispiel listet die Primzahlen zwischen 1 und 30 auf. Der Bereich der lokalen Variablen wird in Codekommentaren beschrieben.

Public Sub ListPrimes()
    ' The sb variable can be accessed only
    ' within the ListPrimes procedure.
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only
    ' within the For...Next block.  A different
    ' variable with the same name could be declared
    ' outside of the For...Next block.
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29
End Sub

Private Function CheckIfPrime(ByVal number As Integer) As Boolean
    If number < 2 Then
        Return False
    Else
        ' The root and highCheck variables can be accessed
        ' only within the Else block.  Different variables
        ' with the same names could be declared outside of
        ' the Else block.
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within
        ' the For...Next block.
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then
                Return False
            End If
        Next

        Return True
    End If
End Function

Beispiel 3

Im folgenden Beispiel wird die speedValue-Variable auf der Klassenebene deklariert. Das Schlüsselwort Private wird verwendet, um die Variable zu deklarieren. Auf die Variable kann von jeder Prozedur in der Car-Klasse zugegriffen werden.

' Create a new instance of a Car.
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by
    ' any procedure in the Car class.
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer
        Get
            Return speedValue
        End Get
    End Property

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub
End Class

Weitere Informationen