Dim-Anweisung (Visual Basic)

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

Syntax

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

Bestandteile

  • attributelist

    Optional. Weitere Informationen finden Sie unter Attributliste.

  • accessmodifier

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

    Siehe Access levels in Visual Basic.

  • Shared

    Optional. Weitere Informationen finden Sie unter Freigegebene.

  • Shadows

    Optional. Weitere Informationen finden Sie unter Schatten.

  • Static

    Optional. Weitere Informationen finden Sie unter Static.

  • ReadOnly

    Optional. Weitere Informationen finden Sie unter ReadOnly.

  • WithEvents

    Optional. Gibt an, dass dies Objektvariablen sind, die auf Instanzen einer Klasse verweisen, die Ereignisse auslösen können. Weitere Informationen finden Sie unter 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 Grenzen jeder Dimension einer Arrayvariablen.
    New Optional. Erstellt eine neue Instanz der -Klasse, wenn die Dim -Anweisung ausgeführt wird.
    datatype Optional. Datentyp der Variablen.
    With Optional. Führt die Objektinitialisiererliste ein.
    propertyname Optional. Der Name einer Eigenschaft in der Klasse, von der Sie eine Instanz erstellen.
    propinitializer Erforderlich nach propertyname =. Der 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. welchen Code auf die Variable zugreifen kann. Im folgenden Beispiel wird eine Variable deklariert, die einen Integer Wert enthalten soll.

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 New Schlüsselwort , um eine neue Instanz der Klasse oder Struktur zu erstellen, die vom Datentyp angegeben wird. Wenn Sie New verwenden, verwenden Sie keinen Initialisiererausdruck. Stattdessen geben Sie Argumente, sofern erforderlich, für 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. Membervariablen befinden sich im Gültigkeitsbereich ihrer gesamten Klasse, Struktur oder Ihres Moduls. Eine Variable, die auf Prozedurebene deklariert wird, ist eine lokale Variable. Lokale Variablen befinden sich nur innerhalb ihrer Prozedur oder ihres Blocks im Gültigkeitsbereich.

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

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

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

Wenn Option Explicit aktiviert ist (Standardeinstellung), benötigt der Compiler eine Deklaration für jede Variable, die Sie verwenden. Weitere Informationen finden Sie unter Option Explicit-Anweisung.

Angeben eines Anfangswerts

Sie können einer Variablen beim Erstellen einen Wert zuweisen. Für einen Werttyp verwenden Sie einen Initialisierer, um einen Ausdruck zur Verfügung zu stellen, der der Variablen zugewiesen werden soll. Der Ausdruck muss zu einer Konstante ausgewertet werden, die zur Kompilierzeit berechnet werden kann.

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

Wenn ein Initialisierer angegeben wird und ein Datentyp nicht in einer -Klausel angegeben As ist, wird der Typrückschluss verwendet, um den Datentyp aus dem Initialisierer abzuleitenden. Im folgenden Beispiel sind sowohl als auch num1 stark als ganze Zahlen num2 typisiert. In der zweiten Deklaration leitet der Typrückschluss den Typ aus dem Wert 3 ab.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Der Typrückschluss gilt auf Prozedurebene. Sie gilt nicht außerhalb einer Prozedur in einer Klasse, Struktur, einem Modul oder einer Schnittstelle. Weitere Informationen zum Typrückschluss finden Sie unter Option Infer Statement und Local Type Inference.

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

Sie können einen Objektinitialisierer verwenden, um Instanzen benannter und anonymer 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 Vorgehensweise: Deklarieren eines Objekts mithilfe eines Objektinitialisierers, Objektinitialisierer: Benannte und anonyme Typenund anonyme Typen.

Deklarieren mehrerer Variablen

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

Dim lastTime, nextTime, allTimes() As Date

Wenn Sie mehrere Variablen mit einer Klausel deklarieren, As können Sie keinen Initialisierer für diese Gruppe von Variablen angeben.

Sie können verschiedene Datentypen für verschiedene Variablen angeben, indem Sie eine separate As -Klausel für jede Variable verwenden, die Sie deklarieren. Jede Variable nimmt den Datentyp an, der in der ersten Klausel angegeben ist, die As nach ihrem Teil gefunden variablename wurde.

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 deklarieren, die ein Array enthalten soll, das mehrere Werte enthalten kann. Um anzugeben, dass eine Variable ein Array enthält, folgen Sie variablename sofort mit Klammern. Weitere Informationen zu Arrays finden Sie unter Arrays.

Sie können die untere und obere Grenze jeder Dimension eines Arrays angeben. Fügen Sie hierzu ein boundslist in die Klammern ein. Für jede Dimension boundslist gibt die Obergrenze und optional die untere Grenze an. Die untere Grenze ist immer 0 (null), unabhängig davon, ob Sie sie angeben oder nicht. Jeder Index kann von 0 (null) bis zu seinem oberen Begrenzungswert 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 4 Zeilen (3 + 1) von jeweils 6 Spalten (5 + 1). Beachten Sie, dass eine Obergrenze den höchsten möglichen Wert für den Index und nicht die Länge der Dimension darstellt. Die Länge der Dimension ist die Obergrenze plus 1.

Dim matrix2(3, 5) As Double

Ein Array kann zwischen 1 und 32 Dimensionen haben.

Sie können alle Begrenzungen in einer Arraydeklaration leer lassen. Wenn Sie dies tun, weist das Array die Anzahl von Dimensionen auf, die Sie angeben, ist aber nicht initialisiert. Er hat den Wert , Nothing bis Sie mindestens einige seiner Elemente initialisieren. Die Dim Anweisung muss Begrenzungen entweder für alle Dimensionen oder für keine Dimensionen angeben.

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

Wenn das Array über mehrere Dimensionen verfügt, müssen Sie Kommas zwischen den Klammern einschließen, um die Anzahl der 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, die ein Array der Länge 0 (null) enthält, hat nicht den Wert Nothing . Arrays der Länge 0 (null) sind für bestimmte Common Language Runtime-Funktionen 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 mithilfe eines Arrayliterals initialisieren. Umranden Sie hierzu die Initialisierungswerte mit geschweiften Klammern ( {} ).

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

Bei mehrdimensionalen Arrays wird die Initialisierung für jede separate Dimension in geschweifte Klammern in der äußeren Dimension eingeschlossen. Die Elemente werden in Zeilen-Hauptreihenfolge 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), verwendet die Variable den Datentyp des Initialisierers. Weitere Informationen finden Sie unter 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 angeben, aber keinen Initialisierer angeben, initialisiert Visual Basic die Variable mit dem Standardwert für ihren Datentyp. Die folgende Tabelle zeigt die Standardinitialisierungswerte.

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 12:00 Uhr vom 1. Januar des Jahres 1 (01.01.0001, 12:00:00 Uhr)

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

Lebensdauer statischer lokaler Variablen

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

Prozedurdeklaration Variable initialisiert Variable beendet vorhandene
In einem Modul Beim ersten Aufruf der Prozedur Wenn das Programm die Ausführung beendet
In einer Klasse oder Struktur ist die Prozedur Shared Beim ersten Aufruf der Prozedur entweder für eine bestimmte Instanz oder für die Klasse oder Struktur selbst Wenn das Programm die Ausführung beendet
In einer Klasse oder Struktur ist die Prozedur nicht Shared Das erste Mal, wenn die Prozedur für eine bestimmte Instanz aufgerufen wird Wenn die Instanz für die Garbage Collection (GC) freigegeben wird

Attribute und Modifizierer

Sie können Attribute nur auf Membervariablen anwenden, nicht auf lokale Variablen. Ein Attribut trägt Informationen zu den Metadaten der Assembly bei, was für den temporären Speicher, z. B. lokale Variablen, nicht sinnvoll ist.

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

Sie können angeben, welcher Code auf eine Variable zugreifen kann, indem Sie eine accessmodifier angeben. Klassen- und Modulmembervariablen (außerhalb jeder Prozedur) verwenden standardmäßig privaten Zugriff, und Strukturmembervariablen verwenden standardmäßig ö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, Struktur oder eines Moduls muss den Namen einer Membervariablen mit dem Namen dieser Klasse, Struktur oder dieses Moduls qualifizieren. Code außerhalb einer Prozedur oder eines Blocks kann nicht auf lokale Variablen innerhalb dieser Prozedur oder dieses Blocks verweisen.

Freigeben verwalteter Ressourcen

Der .NET Framework Garbage Collector verwerfen verwaltete Ressourcen ohne zusätzliche Codierung. Sie können jedoch die Beseitigung einer verwalteten Ressource erzwingen, anstatt auf den Garbage Collector zu warten.

Wenn eine Klasse auf einer besonders wertvollen und minderwertigen Ressource (z. B. einer Datenbankverbindung oder einem Dateihandle) gespeichert ist, möchten Sie möglicherweise nicht warten, bis die nächste Garbage Collection eine Klasseninstanz bereinigt, die nicht mehr verwendet wird. 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 zu erzwingen, dass wertvolle Ressourcen sofort freigegeben werden.

Die Using -Anweisung automatisiert den Prozess des Abrufens einer Ressource, des Ausführens einer Reihe von Anweisungen und der anschließenden Beseitigung 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 variable that refers to a Button object,
' create a Button object, and assign the Button object
' to the variable.
Dim switchButton As New System.Windows.Forms.Button

' 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

Im folgenden Beispiel werden die Primzahlen zwischen 1 und 30 aufgelistet. Der Bereich lokaler 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 Klassenebene deklariert. Das Private Schlüsselwort wird verwendet, um die Variable zu deklarieren. Auf die Variable kann von jeder Prozedur in der -Klasse zugegriffen Car 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

Siehe auch