Dim utasítás (Visual Basic)

Deklarálja és lefoglalja a tárterületet egy vagy több változó számára.

Syntax

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

Részek

  • attributelist

    Opcionális. Lásd: Attribútumlista.

  • accessmodifier

    Opcionális. A következők egyike lehet:

    Lásd a Visual Basic hozzáférési szintjeinek megtekintését.

  • Shared

    Opcionális. Lásd: Megosztott.

  • Shadows

    Opcionális. Lásd: Árnyékok.

  • Static

    Opcionális. Lásd: Statikus.

  • ReadOnly

    Opcionális. Lásd: ReadOnly.

  • WithEvents

    Opcionális. Megadja, hogy ezek olyan objektumváltozók, amelyek egy olyan osztály példányára hivatkoznak, amely eseményeket képes létrehozni. Lásd: WithEvents.

  • variablelist

    Szükséges. A jelen utasításban deklarált változók listája.

    variable [ , variable ... ]

    Mindegyik variable a következő szintaxist és részeket tartalmazza:

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

    Része Leírás
    variablename Szükséges. A változó neve. Lásd: Deklarált elemnevek.
    boundslist Opcionális. Tömbváltozó egyes dimenzióinak határainak listája.
    New Opcionális. Az utasítás futtatásakor létrehozza az osztály új példányát Dim .
    datatype Opcionális. A változó adattípusa.
    With Opcionális. Bemutatja az objektum-inicializálók listáját.
    propertyname Opcionális. Egy tulajdonság neve abban az osztályban, amelyből példányt készít.
    propinitializer =után propertyname kötelező megadni. A kiértékelt és a tulajdonságnévhez rendelt kifejezés.
    initializer Nem kötelező, ha New nincs megadva. A változó létrehozásakor kiértékelt és hozzárendelt kifejezés.

Megjegyzések

A Visual Basic fordítója az Dim utasítással határozza meg a változó adattípusát és egyéb adatait, például azt, hogy milyen kód férhet hozzá a változóhoz. Az alábbi példa egy változót deklarál egy Integer érték tárolására.

Dim numberOfStudents As Integer

Bármilyen adattípust vagy enumerálás, struktúra, osztály vagy felület nevét megadhatja.

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

Referenciatípus esetén a New kulcsszóval hozza létre az adattípus által megadott osztály vagy struktúra új példányát. Ha használja New, akkor nem használ inicializáló kifejezést. Ehelyett argumentumokat kell megadnia, ha szükséges, annak az osztálynak a konstruktorának, amelyből a változót létrehozza.

Dim bottomLabel As New System.Windows.Forms.Label

Egy változót deklarálhat egy eljárásban, blokkban, osztályban, struktúrában vagy modulban. Nem deklarálhat változót forrásfájlban, névtérben vagy felületen. További információ: Deklarációs környezetek és alapértelmezett hozzáférési szintek.

A modul szintjén deklarált változó bármely eljáráson kívül tagváltozó vagy mező. A tagváltozók a teljes osztályban, struktúrában vagy modulban hatókörben vannak. Az eljárás szintjén deklarált változó helyi változó. A helyi változók csak az eljárásukon vagy blokkjaikon belül vannak hatókörben.

Az eljáráson kívüli változók deklarálásához a következő hozzáférési módosítók használhatók: Public, Protected, Friend, Protected Friendés Private. További információ: Hozzáférési szintek a Visual Basicben.

A Dim kulcsszó nem kötelező, és általában hiányzik, ha a következő módosítók valamelyikét adja meg: Public, , Protected, Friend, Protected FriendPrivate, , Shared, Shadows, StaticReadOnly, vagy WithEvents.

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

Ha Option Explicit be van kapcsolva (az alapértelmezett), a fordítónak minden használt változóhoz deklarációra van szüksége. További információ: Option Explicit Utasítás.

Kezdeti érték megadása

Az értékeket a létrehozásukkor hozzárendelheti egy változóhoz. Értéktípus esetén inicializálóval adja meg a változóhoz rendelendő kifejezést. A kifejezésnek egy olyan állandóra kell kiértékelnie, amely a fordítás időpontjában számítható ki.

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

Ha egy inicializáló van megadva, és nincs megadva adattípus egy As záradékban, a rendszer típuskövetkeztetést használ az inicializáló adattípusának következtetéséhez. Az alábbi példában mindkettő num1 , és num2 erősen egész számként van begépelve. A második deklarációban a típuskövetkeztetés a típust a 3 értékből következteti.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

A típuskövetkeztetés az eljárás szintjén érvényes. Nem alkalmazható egy osztály, struktúra, modul vagy interfész eljárásán kívül. A típuskövetkeztetésről további információt az Option Infer Utasítás és a Helyi típus következtetése című témakörben talál.

További információ arról, hogy mi történik, ha nincs megadva adattípus vagy inicializáló, lásd a jelen témakör későbbi, Alapértelmezett adattípusai és értékei című szakaszát.

Az objektum-inicializálóval névvel ellátott és névtelen típusú példányokat deklarálhat. Az alábbi kód létrehoz egy osztálypéldányt Student , és objektum inicializáló használatával inicializálja a tulajdonságokat.

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

Az objektum-inicializálókkal kapcsolatos további információkért lásd: Objektum deklarálása objektum inicializáló használatával, Objektum inicializálók: Névvel ellátott és névtelen típusok, névtelen típusok.

Több változó deklarálása

Több változót is deklarálhat egy deklarációs utasításban, megadva az egyes változók nevét, és zárójelekkel követheti az egyes tömbneveket. Több változót vessző választ el egymástól.

Dim lastTime, nextTime, allTimes() As Date

Ha egynél több változót deklarál egy As záradékkal, az adott változócsoporthoz nem adhat meg inicializálót.

A különböző változókhoz különböző adattípusokat adhat meg egy külön As záradék használatával minden egyes deklarált változóhoz. Minden változó az első As záradékban megadott adattípust veszi fel, amely a része után jelenik variablename meg.

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

Tömbök

Deklarálhat egy változót egy tömb tárolására, amely több értéket is tartalmazhat. Ha meg szeretné adni, hogy egy változó tartalmaz-e tömböt, kövesse variablename a tömböt zárójelekkel. A tömbökről további információt a Tömbök című témakörben talál.

Megadhatja egy tömb minden dimenziójának alsó és felső határát. Ehhez adjon meg egy boundslist zárójelet. Minden dimenzió esetében a boundslist felső és opcionálisan az alsó határt adja meg. Az alsó határ mindig nulla, akár megadja, akár nem. Az egyes indexek a felső kötött értéktől függően nullától eltérőek lehetnek.

Az alábbi két utasítás egyenértékű. Minden utasítás 21 Integer elemből álló tömböt deklarál. A tömb elérésekor az index 0 és 20 közötti lehet.

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

Az alábbi utasítás egy kétdimenziós tömböt Doubledeklarál. A tömb 4 sorból (3 + 1) 6 oszlopból (5 + 1) áll. Vegye figyelembe, hogy a felső határ az index lehetséges legmagasabb értékét jelöli, nem a dimenzió hosszát. A méret hossza a felső határ plusz egy.

Dim matrix2(3, 5) As Double

A tömbök mérete 1 és 32 között lehet.

Az összes korlátot üresen hagyhatja egy tömbdeklarációban. Ha ezt teszi, a tömb a megadott számú dimenzióval rendelkezik, de nem inicializálódik. Értéke addig van Nothing , amíg el nem inicializálja legalább néhány elemét. Az Dim utasításnak meg kell adnia a korlátokat az összes dimenzióhoz vagy egyetlen dimenzióhoz sem.

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

Ha a tömb több dimenzióval is rendelkezik, a zárójelek között vesszőket kell tartalmaznia a dimenziók számának jelzéséhez.

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

Nulla hosszúságú tömb deklarálható úgy, hogy a tömb egyik dimenzióját -1-nek deklarálja. A nulla hosszúságú tömböt tartalmazó változó nem rendelkezik az értékkel Nothing. Bizonyos gyakori nyelvi futtatókörnyezeti függvények nulla hosszúságú tömböket igényelnek. Ha megpróbál hozzáférni egy ilyen tömbhöz, futásidejű kivétel lép fel. További információ: Tömbök.

A tömb értékeit egy tömbkonstans használatával inicializálhatja. Ehhez vegye körül az inicializálási értékeket kapcsos zárójelekkel ({}).

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

Többdimenziós tömbök esetén az egyes különálló dimenziók inicializálása a külső dimenzióban kapcsos zárójelek közé kerül. Az elemek sor-fő sorrendben vannak megadva.

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

A tömbkonstansokról további információt a Tömbök című témakörben talál.

Alapértelmezett adattípusok és értékek

Az alábbi táblázat az adattípus és az inicializáló Dim utasítás különböző kombinációinak eredményeit ismerteti.

Adattípus megadva? Inicializáló van megadva? Példa Eredmény
Nem Nem Dim qty Ha a Szigorú beállítás ki van kapcsolva (az alapértelmezett), a változó Nothingértéke .

Ha Option Strict be van kapcsolva, fordítási időhiba lép fel.
Nem Igen Dim qty = 5 Ha az Option Infer be van kapcsolva (az alapértelmezett), a változó az inicializáló adattípusát veszi fel. Lásd: Helyi típus következtetése.

Ha Option Infer ki van kapcsolva, és Option Strict ki van kapcsolva, a változó a következő adattípust Objectveszi fel: .

Ha Option Infer ki van kapcsolva, és Option Strict be van kapcsolva, fordítási időhiba lép fel.
Igen Nem Dim qty As Integer A változó inicializálása az adattípus alapértelmezett értékére történik. Tekintse meg a táblázatot a szakasz későbbi részében.
Igen Igen Dim qty As Integer = 5 Ha az inicializáló adattípusa nem konvertálható a megadott adattípusra, fordítási időhiba lép fel.

Ha adattípust ad meg, de nem ad meg inicializálót, a Visual Basic inicializálja a változót az adattípus alapértelmezett értékére. Az alábbi táblázat az alapértelmezett inicializálási értékeket mutatja.

Adattípus Alapértelmezett érték
Minden numerikus típus (beleértve Byte és SByte) 0
Char Bináris 0
Minden referenciatípus (beleértve Objecta , Stringés az összes tömböt) Nothing
Boolean False
Date Január 1-jének 12:00 órai (01/01/0001 12:00:00)

A struktúra minden eleme inicializálva van, mintha külön változó lenne. Ha egy tömb hosszát deklarálja, de nem inicializálja az elemeit, minden elem inicializálva lesz, mintha külön változó lenne.

Statikus helyi változó élettartama

A Static helyi változó élettartama hosszabb, mint annak az eljárásnak az élettartama, amelyben deklarálva van. A változó élettartamának határai attól függenek, hogy hol deklarálják az eljárást, és hogy van-e Shared.

Eljárás deklarációja Változó inicializálva A változó leállítja a meglévőt
Modulban Az eljárás első meghívása Amikor a program leállítja a végrehajtást
Osztályban vagy struktúrában az eljárás Shared Az első alkalommal, amikor az eljárást meghívják egy adott példányon, vagy maga az osztály vagy a struktúra Amikor a program leállítja a végrehajtást
Osztályban vagy struktúrában az eljárás nem Shared Az eljárás első meghívása egy adott példányon A példány szemétgyűjtéshez (GC) való kiadásakor

Attribútumok és módosítók

Attribútumokat csak tagváltozókra alkalmazhat, helyi változókra nem. Az attribútumok információkat adnak hozzá a szerelvény metaadataihoz, ami nem értelmezhető az ideiglenes tárolás, például a helyi változók esetében.

Modulszinten nem használhatja a módosítót tagváltozók Static deklarálásához. Eljárásszinten a helyi változók deklarálásához nem használhat Shared, Shadows, ReadOnly, vagy WithEventsbármilyen hozzáférési módosítót.

Megadhatja, hogy melyik kód férhet hozzá egy változóhoz egy accessmodifier. Az osztály- és modultagváltozók (az eljáráson kívül) alapértelmezés szerint a privát hozzáférés, a struktúratag változói pedig alapértelmezés szerint a nyilvános hozzáféréshez tartoznak. A hozzáférési szinteket a hozzáférési módosítókkal módosíthatja. A hozzáférési módosítókat nem használhatja helyi változókon (eljáráson belül).

Csak tagváltozók esetén adható meg WithEvents , az eljáráson belüli helyi változókon nem. Ha megadja WithEvents, a változó adattípusának egy adott osztálytípusnak kell lennie, nem Objectpedig egy adott osztálytípusnak. Nem deklarálhat tömböt a következővel WithEvents: . Az eseményekről további információt az Események című témakörben talál.

Feljegyzés

Az osztályon, struktúrán vagy modulon kívüli kódnak egy tagváltozó nevét kell minősítenie az adott osztály, struktúra vagy modul nevével. Az eljáráson vagy blokkon kívüli kód nem hivatkozhat az eljáráson vagy blokkon belüli helyi változókra.

Felügyelt erőforrások felszabadítása

A .NET-keretrendszer szemétgyűjtő a felügyelt erőforrásokat anélkül dobja el, hogy további kódolást alkalmaz az Ön részéről. A szemétgyűjtőre való várakozás helyett azonban kényszerítheti egy felügyelt erőforrás ártalmatlanítását.

Ha egy osztály különösen értékes és szűkös erőforráshoz (például adatbázis-kapcsolathoz vagy fájlleíróhoz) tartozik, nem érdemes megvárni a következő szemétgyűjtést, hogy megtisztítsa a már nem használt osztálypéldányt. Az osztály implementálhatja az IDisposable interfészt, hogy módot biztosítson az erőforrások szemétgyűjtés előtti kiadására. Az interfészt megvalósító osztály egy Dispose metódust tesz elérhetővé, amely meghívható, hogy az értékes erőforrásokat azonnal felszabadítsa.

Az Using utasítás automatizálja egy erőforrás beszerzésének, egy utasításkészlet végrehajtásának, majd az erőforrás eltávolításának folyamatát. Az erőforrásnak azonban implementálnia kell az interfészt IDisposable . További információ: Az utasítás használata.

1. példa

Az alábbi példa különböző beállításokkal deklarálja a változókat az Dim utasítás használatával.

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

2. példa

Az alábbi példa az 1 és 30 közötti prímszámokat sorolja fel. A helyi változók hatókörét a kód megjegyzései ismertetik.

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

3. példa

Az alábbi példában a speedValue változó az osztály szintjén van deklarálva. A Private kulcsszó a változó deklarálásához használatos. A változó az osztály bármely eljárásával Car elérhető.

' 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

Lásd még