Share via


Dim-instructie (Visual Basic)

Declareert en wijst opslagruimte toe voor een of meer variabelen.

Syntaxis

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

generator

  • attributelist

    Optioneel. Zie de lijst met kenmerken.

  • accessmodifier

    Optioneel. Dit kan een van de volgende zijn:

    Zie Access-niveaus in Visual Basic.

  • Shared

    Optioneel. Zie Gedeeld.

  • Shadows

    Optioneel. Zie schaduwen.

  • Static

    Optioneel. Zie Statisch.

  • ReadOnly

    Optioneel. Zie ReadOnly.

  • WithEvents

    Optioneel. Hiermee geeft u op dat dit objectvariabelen zijn die verwijzen naar exemplaren van een klasse die gebeurtenissen kan genereren. Zie WithEvents.

  • variablelist

    Vereist. Lijst met variabelen die in deze instructie worden gedeclareerd.

    variable [ , variable ... ]

    Elk variable heeft de volgende syntaxis en onderdelen:

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

    Onderdeel Beschrijving
    variablename Vereist. Naam van de variabele. Zie Gedeclareerde elementnamen.
    boundslist Optioneel. Lijst met grenzen van elke dimensie van een matrixvariabele.
    New Optioneel. Hiermee maakt u een nieuw exemplaar van de klasse wanneer de Dim instructie wordt uitgevoerd.
    datatype Optioneel. Gegevenstype van de variabele.
    With Optioneel. Introduceert de lijst met object-initialisatiefuncties.
    propertyname Optioneel. De naam van een eigenschap in de klasse waarvan u een exemplaar maakt.
    propinitializer Vereist na propertyname =. De expressie die wordt geëvalueerd en toegewezen aan de naam van de eigenschap.
    initializer Optioneel als New dit niet is opgegeven. Expressie die wordt geëvalueerd en toegewezen aan de variabele wanneer deze wordt gemaakt.

Opmerkingen

De Visual Basic-compiler gebruikt de Dim instructie om het gegevenstype van de variabele en andere informatie te bepalen, zoals welke code toegang heeft tot de variabele. In het volgende voorbeeld wordt een variabele gede declareren voor het opslaan van een Integer waarde.

Dim numberOfStudents As Integer

U kunt elk gegevenstype of de naam van een opsomming, structuur, klasse of interface opgeven.

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

Voor een verwijzingstype gebruikt u het New trefwoord om een nieuw exemplaar te maken van de klasse of structuur die is opgegeven door het gegevenstype. Als u gebruikt New, gebruikt u geen initialisatie-expressie. In plaats daarvan geeft u argumenten op, indien nodig, aan de constructor van de klasse waaruit u de variabele maakt.

Dim bottomLabel As New System.Windows.Forms.Label

U kunt een variabele declareren in een procedure, blok, klasse, structuur of module. U kunt geen variabele declareren in een bronbestand, naamruimte of interface. Zie Declaratiecontexten en standaardtoegangsniveaus voor meer informatie.

Een variabele die buiten een procedure op moduleniveau wordt gedeclareerd, is een lidvariabele of veld. Lidvariabelen vallen binnen het bereik van hun klasse, structuur of module. Een variabele die op procedureniveau wordt gedeclareerd, is een lokale variabele. Lokale variabelen vallen alleen binnen het bereik binnen hun procedure of blok.

De volgende toegangsaanpassingen worden gebruikt om variabelen buiten een procedure te declareren: Public, Protected, Friend, Protected Friend, en Private. Zie Access-niveaus in Visual Basic voor meer informatie.

Het Dim trefwoord is optioneel en wordt meestal weggelaten als u een van de volgende modifiers opgeeft: Public, , FriendProtected, Protected Friend, Private, , SharedShadows, , Static, of ReadOnlyWithEvents.

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

Als Option Explicit deze is ingeschakeld (de standaardinstelling), vereist de compiler een declaratie voor elke variabele die u gebruikt. Zie Optie expliciete instructie voor meer informatie.

Een initiële waarde opgeven

U kunt een waarde toewijzen aan een variabele wanneer deze wordt gemaakt. Voor een waardetype gebruikt u een initialisatiefunctie om een expressie op te geven die aan de variabele moet worden toegewezen. De expressie moet resulteren in een constante die tijdens het compileren kan worden berekend.

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

Als er een initialisatiefunctie is opgegeven en er geen gegevenstype is opgegeven in een As component, wordt typedeductie gebruikt om het gegevenstype van de initialisatiefunctie af te stellen. In het volgende voorbeeld worden beide num1 sterk num2 getypt als gehele getallen. In de tweede declaratie wordt het type afgeleid van de waarde 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Typedeductie is van toepassing op procedureniveau. Deze is niet van toepassing buiten een procedure in een klasse, structuur, module of interface. Zie Option Infer Statement en Local Type Inference voor meer informatie over typedeductie.

Zie Standaardgegevenstypen en -waarden verderop in dit onderwerp voor informatie over wat er gebeurt wanneer een gegevenstype of initialisatiefunctie niet is opgegeven.

U kunt een object-initialisatiefunctie gebruiken om instanties van benoemde en anonieme typen te declareren. Met de volgende code wordt een exemplaar van een Student klasse gemaakt en wordt een object-initialisatiefunctie gebruikt om eigenschappen te initialiseren.

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

Zie Voor meer informatie over object initializers: Declareer een object met behulp van een Object Initializer, Object Initializers: Named and Anonymous Types, and Anonymous Types, and Anonymous Types.

Meerdere variabelen declareren

U kunt verschillende variabelen declareren in één declaratie-instructie, waarbij u de naam van de variabele voor elke variabele opgeeft en elke matrixnaam met haakjes volgt. Meerdere variabelen worden gescheiden door komma's.

Dim lastTime, nextTime, allTimes() As Date

Als u meer dan één variabele met één As component declareert, kunt u geen initialisatie voor die groep variabelen opgeven.

U kunt verschillende gegevenstypen voor verschillende variabelen opgeven met behulp van een afzonderlijke As component voor elke variabele die u declareert. Elke variabele gebruikt het gegevenstype dat is opgegeven in de eerste As component die na het onderdeel is variablename aangetroffen.

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

Matrices

U kunt een variabele declareren voor het opslaan van een matrix, die meerdere waarden kan bevatten. Als u wilt opgeven dat een variabele een matrix bevat, volgt variablename u deze onmiddellijk met haakjes. Zie Matrices voor meer informatie over matrices.

U kunt de onder- en bovengrens van elke dimensie van een matrix opgeven. Neem hiervoor een boundslist haakje op. Voor elke dimensie geeft u boundslist de bovengrens en eventueel de ondergrens op. De ondergrens is altijd nul, ongeacht of u deze opgeeft of niet. Elke index kan variëren van nul tot de bovengrenswaarde.

De volgende twee instructies zijn gelijkwaardig. Elke instructie declareert een matrix van 21 Integer elementen. Wanneer u de matrix opent, kan de index variëren van 0 tot en met 20.

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

De volgende instructie declareert een tweedimensionale matrix van het type Double. De matrix heeft 4 rijen (3 + 1) van elk 6 kolommen (5 + 1). Houd er rekening mee dat een bovengrens de hoogst mogelijke waarde voor de index vertegenwoordigt, niet de lengte van de dimensie. De lengte van de dimensie is de bovengrens plus één.

Dim matrix2(3, 5) As Double

Een matrix kan van 1 tot 32 dimensies hebben.

U kunt alle grenzen leeg laten in een matrixdeclaratie. Als u dit doet, heeft de matrix het aantal dimensies dat u opgeeft, maar is deze niet geïnitialiseerd. De waarde heeft een waarde totdat Nothing u ten minste enkele elementen initialiseert. De Dim instructie moet grenzen opgeven voor alle dimensies of voor geen dimensies.

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

Als de matrix meer dan één dimensie heeft, moet u komma's tussen de haakjes opnemen om het aantal dimensies aan te geven.

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

U kunt een matrix met lengte nul declareren door een van de dimensies van de matrix te declareren als -1. Een variabele met een matrix met lengte nul heeft de waarde Nothingniet. Matrices met lengte nul zijn vereist voor bepaalde algemene taalruntimefuncties. Als u toegang probeert te krijgen tot een dergelijke matrix, treedt er een runtime-uitzondering op. Zie Matrices voor meer informatie.

U kunt de waarden van een matrix initialiseren met behulp van een letterlijke matrix. Hiervoor zet u de initialisatiewaarden tussen accolades ({}).

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

Voor multidimensionale matrices wordt de initialisatie voor elke afzonderlijke dimensie tussen accolades in de buitendimensie geplaatst. De elementen worden opgegeven in rijvolgorde.

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

Zie Matrices voor meer informatie over letterlijke matrices.

Standaardgegevenstypen en -waarden

In de volgende tabel worden de resultaten beschreven van verschillende combinaties van het opgeven van het gegevenstype en de initialisatiefunctie in een Dim instructie.

Opgegeven gegevenstype? Initialisatiefunctie opgegeven? Opmerking Resultaat
Nee Nr. Dim qty Als Option Strict is uitgeschakeld (de standaardinstelling), wordt de variabele ingesteld op Nothing.

Als Option Strict dit is ingeschakeld, treedt er een compilatiefout op.
Nr. Ja Dim qty = 5 Als Option Infer is ingeschakeld (de standaardinstelling), neemt de variabele het gegevenstype van de initialisatiefunctie. Zie deductie van het lokale type.

Als Option Infer de variabele is uitgeschakeld en Option Strict is uitgeschakeld, wordt het gegevenstype van de variabele gebruikt Object.

Als Option Infer deze is uitgeschakeld en Option Strict is ingeschakeld, treedt er een compilatietijdfout op.
Ja Nr. Dim qty As Integer De variabele wordt geïnitialiseerd tot de standaardwaarde voor het gegevenstype. Zie de tabel verderop in deze sectie.
Ja Ja Dim qty As Integer = 5 Als het gegevenstype van de initialisatiefunctie niet kan worden omgezet in het opgegeven gegevenstype, treedt er een compilatiefout op.

Als u een gegevenstype opgeeft, maar geen initialisatiefunctie opgeeft, initialiseert Visual Basic de variabele naar de standaardwaarde voor het gegevenstype. In de volgende tabel ziet u de standaard initialisatiewaarden.

Gegevenstype Default value
Alle numerieke typen (inclusief Byte en SByte) 0
Char Binair 0
Alle referentietypen (inclusief Object, Stringen alle matrices) Nothing
Boolean False
Date 12:00 uur van 1 januari van het jaar 1 (01/01/0001 12:00:00 uur)

Elk element van een structuur wordt geïnitialiseerd alsof het een afzonderlijke variabele is. Als u de lengte van een matrix declareert, maar de elementen niet initialiseert, wordt elk element geïnitialiseerd alsof het een afzonderlijke variabele is.

Levensduur van statische lokale variabelen

Een Static lokale variabele heeft een langere levensduur dan die van de procedure waarin deze wordt gedeclareerd. De grenzen van de levensduur van de variabele zijn afhankelijk van waar de procedure wordt gedeclareerd en of deze is Shared.

Proceduredeclaratie Variabele geïnitialiseerd Variabele stopt bestaande
In een module De eerste keer dat de procedure wordt aangeroepen Wanneer uw programma de uitvoering stopt
In een klasse of structuur is de procedure Shared De eerste keer dat de procedure wordt aangeroepen op een specifiek exemplaar of op de klasse of structuur zelf Wanneer uw programma de uitvoering stopt
In een klasse of structuur is de procedure niet Shared De eerste keer dat de procedure wordt aangeroepen op een specifiek exemplaar Wanneer het exemplaar wordt vrijgegeven voor garbagecollection (GC)

Kenmerken en modifiers

U kunt kenmerken alleen toepassen op lidvariabelen, niet op lokale variabelen. Een kenmerk draagt informatie bij aan de metagegevens van de assembly, wat niet zinvol is voor tijdelijke opslag, zoals lokale variabelen.

Op moduleniveau kunt u de Static wijzigingsfunctie niet gebruiken om lidvariabelen te declareren. Op procedureniveau kunt u geen toegangsaanpassingen gebruiken SharedShadowsReadOnlyWithEventsom lokale variabelen te declareren.

U kunt opgeven welke code toegang heeft tot een variabele door een accessmodifier. Klasse- en modulelidvariabelen (buiten elke procedure) zijn standaard ingesteld op persoonlijke toegang en structuurlidvariabelen zijn standaard ingesteld op openbare toegang. U kunt hun toegangsniveaus aanpassen met de toegangsaanpassingen. U kunt geen toegangsmodifiers gebruiken voor lokale variabelen (binnen een procedure).

U kunt alleen opgeven WithEvents voor lidvariabelen, niet voor lokale variabelen binnen een procedure. Als u opgeeft WithEvents, moet het gegevenstype van de variabele een specifiek klassetype zijn, niet Object. U kunt geen matrix declareren met WithEvents. Zie Gebeurtenissen voor meer informatie over gebeurtenissen.

Notitie

Code buiten een klasse, structuur of module moet de naam van een lidvariabele kwalificeren met de naam van die klasse, structuur of module. Code buiten een procedure of blok kan niet verwijzen naar lokale variabelen binnen die procedure of blok.

Beheerde resources vrijgeven

De garbagecollector van .NET Framework verwijdert beheerde resources zonder extra codering aan uw kant. U kunt echter de verwijdering van een beheerde resource afdwingen in plaats van te wachten op de garbagecollector.

Als een klasse een bijzonder waardevolle en schaarse resource bevat (zoals een databaseverbinding of bestandsgreep), wilt u mogelijk niet wachten totdat de volgende garbagecollection een klasse-exemplaar opschoont dat niet meer wordt gebruikt. Een klasse kan de IDisposable interface implementeren om resources vrij te geven vóór een garbagecollection. Een klasse die deze interface implementeert, bevat een Dispose methode die kan worden aangeroepen om waardevolle resources onmiddellijk vrij te geven.

De Using instructie automatiseert het proces van het verkrijgen van een resource, het uitvoeren van een set instructies en het verwijderen van de resource. De resource moet echter de IDisposable interface implementeren. Zie Using Statement voor meer informatie.

Voorbeeld 1

In het volgende voorbeeld worden variabelen gede declareren met behulp van de Dim instructie met verschillende opties.

' 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}

Voorbeeld 2

In het volgende voorbeeld worden de priemgetallen tussen 1 en 30 weergegeven. Het bereik van lokale variabelen wordt beschreven in codeopmerkingen.

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

Voorbeeld 3

In het volgende voorbeeld wordt de speedValue variabele gedeclareerd op klasseniveau. Het Private trefwoord wordt gebruikt om de variabele te declareren. De variabele kan worden geopend door elke procedure in de Car klasse.

' 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

Zie ook