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í:
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
, , Protected
Friend
, Protected Friend
, Private
, , Shadows
Shared
, Static
, , nebo ReadOnly
WithEvents
.
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 Nothing hodnotu .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ě Object String , 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
, , Shadows
ReadOnly
, WithEvents
, ani žádné modifikátory přístupu k deklaraci místních proměnných.
Zadáním znaku accessmodifier
můž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é
- Příkaz Const
- Příkaz ReDim
- Příkaz Option Explicit
- Příkaz Option Infer
- Příkaz Option Strict
- Stránka Kompilovat, Návrhář projektu (Visual Basic)
- Deklarace proměnné
- Pole
- Inicializátory objektů: pojmenované a anonymní typy
- Anonymní typy
- Inicializátory objektů: pojmenované a anonymní typy
- Postupy: Deklarace objektu pomocí inicializátoru objektu
- Odvození místního typu