Dela via


Dim-instruktion (Visual Basic)

Deklarerar och allokerar lagringsutrymme för en eller flera variabler.

Syntax

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

Delar

  • attributelist

    Valfritt. Se Attributlista.

  • accessmodifier

    Valfritt. Kan vara något av följande:

    Se Åtkomstnivåer i Visual Basic.

  • Shared

    Valfritt. Se Delat.

  • Shadows

    Valfritt. Se Skuggor.

  • Static

    Valfritt. Se Statisk.

  • ReadOnly

    Valfritt. Se ReadOnly.

  • WithEvents

    Valfritt. Anger att det här är objektvariabler som refererar till instanser av en klass som kan generera händelser. Se WithEvents.

  • variablelist

    Obligatoriska. Lista över variabler som deklareras i den här instruktionen.

    variable [ , variable ... ]

    Var variable och en har följande syntax och delar:

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

    Delvis beskrivning
    variablename Obligatoriskt. Namnet på variabeln. Se Deklarerade elementnamn.
    boundslist Valfritt. Lista över gränser för varje dimension i en matrisvariabel.
    New Valfritt. Skapar en ny instans av klassen när -instruktionen Dim körs.
    datatype Valfritt. Datatyp för variabeln.
    With Valfritt. Introducerar objektinitieringslistan.
    propertyname Valfritt. Namnet på en egenskap i klassen som du gör en instans av.
    propinitializer Krävs efter propertyname =. Uttrycket som utvärderas och tilldelas till egenskapsnamnet.
    initializer Valfritt om New inte har angetts. Uttryck som utvärderas och tilldelas till variabeln när den skapas.

Kommentarer

Visual Basic-kompilatorn använder -instruktionen Dim för att fastställa variabelns datatyp och annan information, till exempel vilken kod som kan komma åt variabeln. I följande exempel deklareras en variabel som ska innehålla ett Integer värde.

Dim numberOfStudents As Integer

Du kan ange valfri datatyp eller namnet på en uppräkning, struktur, klass eller gränssnitt.

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

För en referenstyp använder du nyckelordet New för att skapa en ny instans av klassen eller strukturen som anges av datatypen. Om du använder Newanvänder du inte ett initialiseraruttryck. I stället anger du argument, om de behövs, till konstruktorn för klassen som du skapar variabeln från.

Dim bottomLabel As New System.Windows.Forms.Label

Du kan deklarera en variabel i en procedur, blockering, klass, struktur eller modul. Du kan inte deklarera en variabel i en källfil, ett namnområde eller ett gränssnitt. Mer information finns i Deklarationskontexter och standardåtkomstnivåer.

En variabel som deklareras på modulnivå, utanför någon procedur, är en medlemsvariabel eller ett fält. Medlemsvariabler finns i omfånget i hela klassen, strukturen eller modulen. En variabel som deklareras på procedurnivå är en lokal variabel. Lokala variabler finns endast i omfånget inom proceduren eller blocket.

Följande åtkomstmodifierare används för att deklarera variabler utanför en procedur: Public, Protected, Friend, Protected Friendoch Private. Mer information finns i Åtkomstnivåer i Visual Basic.

Nyckelordet Dim är valfritt och utelämnas vanligtvis om du anger någon av följande modifierare: Public, , ProtectedFriend, Protected Friend, , PrivateShared, Shadows, Static, , ReadOnlyeller WithEvents.

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

Om Option Explicit är på (standard) kräver kompilatorn en deklaration för varje variabel som du använder. Mer information finns i Alternativet explicit instruktion.

Ange ett initialt värde

Du kan tilldela ett värde till en variabel när den skapas. För en värdetyp använder du en initialiserare för att ange ett uttryck som ska tilldelas till variabeln. Uttrycket måste utvärderas till en konstant som kan beräknas vid kompileringstillfället.

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

Om en initiator anges och en datatyp inte anges i en As sats används typinferens för att härleda datatypen från initieraren. I följande exempel skrivs både num1 och num2 starkt som heltal. I den andra deklarationen härleder typinferensen typen från värdet 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Typinferens gäller på procedurnivå. Det gäller inte utanför en procedur i en klass, struktur, modul eller gränssnitt. Mer information om typinferens finns i Inferens för alternativinferens och slutsatsdragning av lokal typ.

Information om vad som händer när en datatyp eller initiator inte har angetts finns i Standarddatatyper och Värden senare i det här avsnittet.

Du kan använda en objektinitierare för att deklarera instanser av namngivna och anonyma typer. Följande kod skapar en instans av en Student klass och använder en objektinitierare för att initiera egenskaper.

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

Mer information om objektinitierare finns i Så här deklarerar du ett objekt med hjälp av en objektinitierare, objektinitierare: namngivna och anonyma typer och anonyma typer.

Deklarera flera variabler

Du kan deklarera flera variabler i en deklarationssats, ange variabelnamnet för var och en och följa varje matrisnamn med parenteser. Flera variabler avgränsas med kommatecken.

Dim lastTime, nextTime, allTimes() As Date

Om du deklarerar mer än en variabel med en As sats kan du inte ange en initialiserare för den gruppen med variabler.

Du kan ange olika datatyper för olika variabler med hjälp av en separat As sats för varje variabel som du deklarerar. Varje variabel tar den datatyp som anges i den första As satsen som påträffades efter dess variablename del.

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

Matriser

Du kan deklarera en variabel för att lagra en matris som kan innehålla flera värden. Om du vill ange att en variabel innehåller en matris följer du den variablename omedelbart med parenteser. Mer information om matriser finns i Matriser.

Du kan ange den nedre och övre gränsen för varje dimension i en matris. Det gör du genom att inkludera en boundslist inom parenteserna. För varje dimension boundslist anger den övre gränsen och eventuellt den nedre gränsen. Den nedre gränsen är alltid noll, oavsett om du anger den eller inte. Varje index kan variera från noll till dess övre gränsvärde.

Följande två instruktioner är likvärdiga. Varje instruktion deklarerar en matris med 21 Integer element. När du kommer åt matrisen kan indexet variera från 0 till 20.

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

Följande instruktion deklarerar en tvådimensionell matris av typen Double. Matrisen har 4 rader (3 + 1) med 6 kolumner (5 + 1) vardera. Observera att en övre gräns representerar det högsta möjliga värdet för indexet, inte dimensionens längd. Dimensionens längd är den övre gränsen plus en.

Dim matrix2(3, 5) As Double

En matris kan ha mellan 1 och 32 dimensioner.

Du kan lämna alla gränser tomma i en matrisdeklaration. Om du gör det har matrisen det antal dimensioner som du anger, men den är inte initierad. Den har värdet Nothing tills du initierar åtminstone några av dess element. Instruktionen Dim måste ange gränser för alla dimensioner eller för inga dimensioner.

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

Om matrisen har mer än en dimension måste du inkludera kommatecken mellan parenteserna för att ange antalet dimensioner.

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

Du kan deklarera en matris med noll längd genom att deklarera att en av matrisens dimensioner är -1. En variabel som innehåller en matris med noll längd har inte värdet Nothing. Nolllängdsmatriser krävs av vissa vanliga språkkörningsfunktioner. Om du försöker komma åt en sådan matris inträffar ett körningsundundanstag. Mer information finns i Matriser.

Du kan initiera värdena för en matris med hjälp av en matrisliteral. Det gör du genom att omge initieringsvärdena med klammerparenteser ({}).

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

För flerdimensionella matriser omges initieringen för varje separat dimension av klammerparenteser i den yttre dimensionen. Elementen anges i rad-större ordning.

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

Mer information om matrisliteraler finns i Matriser.

Standarddatatyper och -värden

I följande tabell beskrivs resultatet av olika kombinationer av att ange datatypen och initieraren i en Dim instruktion.

Angiven datatyp? Har initieraren angetts? Exempel Resultat
Nej Nej Dim qty Om Alternativet Strikt är inaktiverat (standardinställningen) är variabeln inställd på Nothing.

Om Option Strict är på uppstår ett kompileringsfel.
Nej Ja Dim qty = 5 Om Alternativinferens är aktiverat (standardvärdet) tar variabeln initiatorns datatyp. Se Slutsatsdragning av lokal typ.

Om Option Infer är av och Option Strict är av tar variabeln datatypen Object.

Om Option Infer är av och Option Strict är på uppstår ett kompileringsfel.
Ja Nej Dim qty As Integer Variabeln initieras till standardvärdet för datatypen. Se tabellen senare i det här avsnittet.
Ja Ja Dim qty As Integer = 5 Om datatypen för initieraren inte kan konverteras till den angivna datatypen uppstår ett kompileringsfel.

Om du anger en datatyp men inte anger någon initiering initierar Visual Basic variabeln till standardvärdet för dess datatyp. I följande tabell visas standardinitieringsvärdena.

Datatyp Default value
Alla numeriska typer (inklusive Byte och SByte) 0
Char Binärt 0
Alla referenstyper (inklusive Object, Stringoch alla matriser) Nothing
Boolean False
Date 12:00 av 1 januari i år 1 (01/01/0001 12:00:00 AM)

Varje element i en struktur initieras som om det vore en separat variabel. Om du deklarerar längden på en matris men inte initierar dess element initieras varje element som om det vore en separat variabel.

Statisk lokal variabellivslängd

En Static lokal variabel har en längre livslängd än den för proceduren som den deklareras i. Gränserna för variabelns livslängd beror på var proceduren deklareras och om den är Shared.

Procedurdeklaration Variabel initierad Variabeln stoppar befintlig
I en modul Första gången proceduren anropas När programmet stoppar körningen
I en klass eller struktur är proceduren Shared Första gången proceduren anropas antingen på en specifik instans eller på själva klassen eller strukturen När programmet stoppar körningen
I en klass eller struktur är proceduren inte Shared Första gången proceduren anropas på en specifik instans När instansen släpps för skräpinsamling (GC)

Attribut och modifierare

Du kan endast använda attribut för medlemsvariabler, inte för lokala variabler. Ett attribut bidrar med information till sammansättningens metadata, vilket inte är meningsfullt för tillfällig lagring, till exempel lokala variabler.

På modulnivå kan du inte använda Static modifieraren för att deklarera medlemsvariabler. På procedurnivå kan du inte använda Shared, Shadows, ReadOnly, WithEventseller åtkomstmodifierare för att deklarera lokala variabler.

Du kan ange vilken kod som kan komma åt en variabel genom att ange en accessmodifier. Medlemsvariabler för klass och modul (utanför alla procedurer) är standard för privat åtkomst och strukturerar medlemsvariabler som standard för offentlig åtkomst. Du kan justera deras åtkomstnivåer med åtkomstmodifierarna. Du kan inte använda åtkomstmodifierare för lokala variabler (i en procedur).

Du kan bara ange WithEvents för medlemsvariabler, inte på lokala variabler i en procedur. Om du anger WithEventsmåste datatypen för variabeln vara en specifik klasstyp, inte Object. Du kan inte deklarera en matris med WithEvents. Mer information om händelser finns i Händelser.

Kommentar

Kod utanför en klass, struktur eller modul måste kvalificera en medlemsvariabels namn med namnet på den klassen, strukturen eller modulen. Kod utanför en procedur eller ett block kan inte referera till några lokala variabler inom den proceduren eller blocket.

Frigöra hanterade resurser

.NET Framework-skräpinsamlaren gör sig av med hanterade resurser utan extra kodning från din sida. Du kan dock tvinga bortskaffandet av en hanterad resurs i stället för att vänta på skräpinsamlaren.

Om en klass håller sig till en särskilt värdefull och knapp resurs (till exempel en databasanslutning eller filhandtag) kanske du inte vill vänta tills nästa skräpinsamling för att rensa en klassinstans som inte längre används. En klass kan implementera IDisposable gränssnittet för att ge ett sätt att frigöra resurser före en skräpinsamling. En klass som implementerar gränssnittet exponerar en Dispose metod som kan anropas för att tvinga värdefulla resurser att släppas omedelbart.

Instruktionen Using automatiserar processen för att hämta en resurs, köra en uppsättning instruktioner och sedan disponera resursen. Resursen måste dock implementera IDisposable gränssnittet. Mer information finns i Använda instruktion.

Exempel 1

I följande exempel deklareras variabler med hjälp av -instruktionen Dim med olika alternativ.

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

Exempel 2

I följande exempel visas de främsta talen mellan 1 och 30. Omfånget för lokala variabler beskrivs i kodkommenterar.

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

Exempel 3

I följande exempel deklareras variabeln speedValue på klassnivå. Nyckelordet Private används för att deklarera variabeln. Variabeln kan nås genom alla procedurer i Car klassen.

' 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

Se även