Sdílet prostřednictvím


Příkaz Dim (Visual Basic)

Deklaruje a přiděluje prostor úložiště pro jednu nebo více proměnných.

Syntaxe

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

Součástky

  • attributelist

    Nepovinné. Viz seznam atributů.

  • accessmodifier

    Nepovinné. Může to být jedna z následujících možností:

    Viz úrovně Accessu v jazyce Visual Basic.

  • Shared

    Nepovinné. Viz Sdílené.

  • Shadows

    Nepovinné. Podívejte se na stíny.

  • Static

    Nepovinné. Viz Statická.

  • ReadOnly

    Nepovinné. Viz ReadOnly.

  • WithEvents

    Nepovinné. Určuje, že se jedná o objektové proměnné odkazující na instance třídy, které mohou vyvolat události. Viz WithEvents.

  • variablelist

    Povinný: Seznam proměnných deklarovaných v tomto příkazu

    variable [ , variable ... ]

    Každá z nich variable má následující syntaxi a části:

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

    Část Popis
    variablename Požadováno. Název proměnné. Viz Deklarované názvy elementů.
    boundslist Nepovinné. Seznam hranic každé dimenze proměnné pole
    New Nepovinné. Vytvoří novou instanci třídy při Dim spuštění příkazu.
    datatype Nepovinné. Datový typ proměnné.
    With Nepovinné. Představuje seznam inicializátorů objektů.
    propertyname Nepovinné. Název vlastnosti ve třídě, ze které vytváříte instanci.
    propinitializer Povinný argument za propertyname =. Výraz, který je vyhodnocen a přiřazen k názvu vlastnosti.
    initializer Volitelné, pokud New není zadáno. Výraz, který se vyhodnotí a přiřadí proměnné při jejím vytvoření.

Poznámky

Kompilátor jazyka Visual Basic používá příkaz Dim k určení datového typu proměnné a dalších informací, jako je například kód, který má k proměnné přístup. Následující příklad deklaruje proměnnou, která má obsahovat Integer hodnotu.

Dim numberOfStudents As Integer

Můžete zadat libovolný datový typ nebo název výčtu, struktury, třídy nebo rozhraní.

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

Pro typ odkazu použijete New klíčové slovo k vytvoření nové instance třídy nebo struktury, která je určena datovým typem. Pokud použijete New, nepoužívejte výraz inicializátoru. Místo toho zadáte argumenty, pokud jsou požadovány, konstruktor třídy, ze které vytváříte proměnnou.

Dim bottomLabel As New System.Windows.Forms.Label

Proměnnou můžete deklarovat v postupu, bloku, třídě, struktuře nebo modulu. Proměnnou nelze deklarovat ve zdrojovém souboru, oboru názvů nebo rozhraní. Další informace naleznete v tématu Kontexty deklarace a výchozí úrovně přístupu.

Proměnná deklarovaná na úrovni modulu mimo jakoukoli proceduru je členské proměnné nebo pole. Členské proměnné jsou v oboru v rámci třídy, struktury nebo modulu. Proměnná deklarovaná na úrovni procedury je místní proměnná. Místní proměnné jsou v oboru pouze v rámci jejich postupu nebo bloku.

Následující modifikátory přístupu slouží k deklaraci proměnných mimo proceduru: Public, Protected, Friend, Protected Friend, a Private. Další informace naleznete v tématu Úrovně přístupu v jazyce Visual Basic.

Klíčové Dim slovo je volitelné a obvykle je vynecháno, pokud zadáte některý z následujících modifikátorů: Public, , ProtectedFriend, Protected Friend, Private, , ShadowsShared, Static, , nebo ReadOnlyWithEvents.

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

Pokud Option Explicit je zapnutá (výchozí), kompilátor vyžaduje deklaraci pro každou proměnnou, kterou použijete. Další informace najdete v tématu Příkaz Option Explicit.

Zadání počáteční hodnoty

Hodnotu můžete přiřadit proměnné při jejím vytvoření. Pro typ hodnoty použijete inicializátor k zadání výrazu, který se má přiřadit proměnné. Výraz musí být vyhodnocen jako konstanta, která se dá vypočítat v době kompilace.

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

Je-li zadán inicializátor a datový typ není zadán v As klauzuli, použije se odvození typu k odvození datového typu z inicializátoru. V následujícím příkladu jsou oba num1 typy num2 silného typu jako celá čísla. Ve druhé deklaraci odvození typu odvozuje typ z hodnoty 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Odvození typu se vztahuje na úrovni procedury. Nevztahuje se mimo proceduru ve třídě, struktuře, modulu nebo rozhraní. Další informace o odvození typu naleznete v tématu Příkaz odvození možnosti a odvození místního typu.

Informace o tom, co se stane, když není zadán datový typ nebo inicializátor, naleznete v části Výchozí datové typy a hodnoty dále v tomto tématu.

Inicializátor objektů můžete použít k deklaraci instancí pojmenovaných a anonymních typů. Následující kód vytvoří instanci Student třídy a pomocí inicializátoru objektů inicializuje vlastnosti.

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

Další informace o inicializátorech objektů naleznete v tématu Postupy: Deklarace objektu pomocí inicializátoru objektů, inicializátory objektů: pojmenované a anonymní typy a anonymní typy.

Deklarování více proměnných

V jednom příkazu deklarace můžete deklarovat několik proměnných, zadat název proměnné pro každý z nich a za každým názvem pole použít závorky. Více proměnných je odděleno čárkami.

Dim lastTime, nextTime, allTimes() As Date

Pokud deklarujete více než jednu proměnnou s jednou As klauzulí, nemůžete pro tuto skupinu proměnných zadat inicializátor.

Pro různé proměnné můžete zadat různé datové typy pomocí samostatné As klauzule pro každou deklarované proměnné. Každá proměnná přebírá datový typ zadaný v první As klauzuli, ke které došlo po jeho variablename části.

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

Pole

Můžete deklarovat proměnnou , která bude obsahovat pole, které může obsahovat více hodnot. Pokud chcete určit, že proměnná obsahuje pole, postupujte variablename okamžitě se závorky. Další informace o polích naleznete v tématu Pole.

Můžete zadat dolní a horní mez každé dimenze pole. Uděláte to tak, že do závorek zahrnete boundslist závorky. Pro každou dimenzi boundslist určuje horní mez a volitelně dolní mez. Dolní mez je vždy nula bez ohledu na to, jestli ji zadáte, nebo ne. Každý index se může lišit od nuly až po jeho horní mez.

Následující dva příkazy jsou ekvivalentní. Každý příkaz deklaruje pole 21 Integer prvků. Při přístupu k poli se index může lišit od 0 do 20.

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

Následující příkaz deklaruje dvojrozměrné pole typu Double. Matice má 4 řádky (3 + 1) ze 6 sloupců (5 + 1). Všimněte si, že horní mez představuje nejvyšší možnou hodnotu indexu, nikoli délku dimenze. Délka rozměru je horní mez plus jedna.

Dim matrix2(3, 5) As Double

Pole může mít rozměry od 1 do 32.

V deklaraci pole můžete ponechat všechny hranice prázdné. Pokud to uděláte, pole má počet zadaných dimenzí, ale není inicializován. Má hodnotu Nothing , dokud neicializujete alespoň některé jeho prvky. Příkaz Dim musí určovat hranice pro všechny dimenze nebo pro žádné dimenze.

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

Pokud má matice více než jednu dimenzi, musíte mezi závorky zahrnout čárky, aby bylo uvedeno počet dimenzí.

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

Pole nulové délky můžete deklarovat deklarací jedné z dimenzí pole na hodnotu -1. Proměnná, která obsahuje pole nulové délky, nemá hodnotu Nothing. Pole s nulovou délkou jsou vyžadována určitými funkcemi modulu CLR (Common Language Runtime). Pokud se pokusíte o přístup k tomuto poli, dojde k výjimce za běhu. Další informace naleznete v tématu Pole.

Hodnoty pole můžete inicializovat pomocí literálu pole. Uděláte to tak, že hodnoty inicializace ohraničíte složenými závorkami ({}).

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

U multidimenzionálních polí je inicializace pro každou samostatnou dimenzi uzavřena do složených závorek ve vnější dimenzi. Prvky jsou zadány v pořadí hlavního řádku.

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

Další informace o maticových literálech naleznete v tématu Pole.

Výchozí datové typy a hodnoty

Následující tabulka popisuje výsledky různých kombinací určení datového typu a inicializátoru Dim v příkazu.

Zadaný datový typ? Inicializátor byl zadán? Příklad Výsledek
No Ne Dim qty Pokud je možnost Strict vypnutá (výchozí), proměnná je nastavena na Nothinghodnotu .

Pokud Option Strict je zapnutá, dojde k chybě v době kompilace.
No Ano Dim qty = 5 Pokud je parametr odvozený (výchozí), proměnná přebírá datový typ inicializátoru. Viz odvození místního typu.

Pokud Option Infer je vypnutý a Option Strict je vypnutý, proměnná přebírá datový typ Object.

Pokud Option Infer je vypnutý a Option Strict je zapnutý, dojde k chybě v době kompilace.
Yes No Dim qty As Integer Proměnná se inicializuje na výchozí hodnotu datového typu. Podívejte se na tabulku dále v této části.
Ano Yes Dim qty As Integer = 5 Pokud datový typ inicializátoru není konvertibilní na zadaný datový typ, dojde k chybě kompilace.

Pokud zadáte datový typ, ale nezadáte inicializátor, Visual Basic inicializuje proměnnou na výchozí hodnotu pro jeho datový typ. Následující tabulka ukazuje výchozí hodnoty inicializace.

Datový typ Default value
Všechny číselné typy (včetně Byte a SByte) 0
Char Binární 0
Všechny odkazové typy (včetně ObjectString, a všech polí) Nothing
Boolean False
Date 12:00 z 1. ledna roku 1 (01.01.001 12:00:00 AM)

Každý prvek struktury je inicializován, jako by šlo o samostatnou proměnnou. Pokud deklarujete délku pole, ale neinicializujete její prvky, každý prvek se inicializuje, jako by to byla samostatná proměnná.

Životnost statické místní proměnné

Static Místní proměnná má delší životnost než procedura, ve které je deklarována. Hranice životnosti proměnné závisí na tom, kde je procedura deklarována a zda je Shared.

Deklarace procedury Inicializovaná proměnná Proměnná zastaví existující
V modulu Při prvním volání procedury Když program přestane s prováděním
Ve třídě nebo struktuře je procedura Shared Při prvním volání procedury buď v konkrétní instanci, nebo v samotné třídě nebo struktuře Když program přestane s prováděním
Ve třídě nebo struktuře není procedura Shared Při prvním volání procedury pro konkrétní instanci Při uvolnění instance pro uvolňování paměti (GC)

Atributy a modifikátory

Atributy můžete použít pouze pro členské proměnné, ne pro místní proměnné. Atribut přispívá k informacím o metadatech sestavení, což není smysluplné pro dočasné úložiště, jako jsou místní proměnné.

Na úrovni modulu nemůžete k deklaraci členských proměnných použít Static modifikátor. Na úrovni procedury nelze použít Shared, , ShadowsReadOnly, WithEvents, ani žádné modifikátory přístupu k deklaraci místních proměnných.

Zadáním znaku accessmodifiermůžete určit, který kód má přístup k proměnné. Proměnné členů třídy a modulu (mimo libovolnou proceduru) jsou výchozí pro privátní přístup a proměnné členů struktury jsou výchozí pro veřejný přístup. Jejich úrovně přístupu můžete upravit pomocí modifikátorů přístupu. Modifikátory přístupu nelze použít u místních proměnných (uvnitř procedury).

Můžete zadat WithEvents pouze členské proměnné, nikoli místní proměnné uvnitř procedury. Pokud zadáte WithEvents, datový typ proměnné musí být určitý typ třídy, nikoli Object. Nelze deklarovat pole s WithEvents. Další informace o událostech naleznete v tématu Události.

Poznámka:

Kód mimo třídu, strukturu nebo modul musí kvalifikovat název členské proměnné s názvem této třídy, struktury nebo modulu. Kód mimo proceduru nebo blok nemůže odkazovat na žádné místní proměnné v rámci této procedury nebo bloku.

Uvolnění spravovaných prostředků

Uvolňování paměti rozhraní .NET Framework odstraňuje spravované prostředky bez jakéhokoli dalšího kódování na vaší straně. Odstranění spravovaného prostředku ale můžete vynutit místo čekání na uvolňování paměti.

Pokud se třída drží zvlášť cenného a vzácného prostředku (například připojení k databázi nebo popisovač souboru), možná nebudete chtít počkat, až další uvolňování paměti vyčistí instanci třídy, která se už nepoužívá. Třída může implementovat IDisposable rozhraní, které poskytuje způsob uvolnění prostředků před uvolňováním paměti. Třída, která implementuje toto rozhraní zveřejňuje metodu Dispose , kterou lze volat k vynucení okamžitého uvolnění cenných prostředků.

Tento Using příkaz automatizuje proces získání prostředku, spuštění sady příkazů a následného odstranění prostředku. Prostředek však musí implementovat IDisposable rozhraní. Další informace naleznete v tématu Using – příkaz.

Příklad 1

Následující příklad deklaruje proměnné pomocí Dim příkazu s různými možnostmi.

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

Příklad 2

Následující příklad uvádí základní čísla mezi 1 a 30. Rozsah místních proměnných je popsán v komentářích kódu.

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

Příklad 3

V následujícím příkladu speedValue je proměnná deklarována na úrovni třídy. Klíčové Private slovo se používá k deklaraci proměnné. K proměnné může přistupovat libovolná procedura Car ve třídě.

' 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

Viz také