Dim — instrukcja (Visual Basic)
Deklaruje i przydziela miejsce do magazynowania dla co najmniej jednej zmiennej.
Składnia
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist
generatora
attributelist
Opcjonalny. Zobacz Lista atrybutów.
accessmodifier
Opcjonalny. Może być jednym z następujących elementów:
Zobacz Poziomy dostępu w Visual Basic.
Shared
Opcjonalny. Zobacz Udostępnione.
Shadows
Opcjonalny. Zobacz Cienie.
Static
Opcjonalny. Zobacz Statyczne.
ReadOnly
Opcjonalny. Zobacz ReadOnly.
WithEvents
Opcjonalny. Określa, że są to zmienne obiektu odwołujące się do wystąpień klasy, która może zgłaszać zdarzenia. Zobacz WithEvents.
variablelist
Wymagany. Lista zmiennych zadeklarowanych w tej instrukcji.
variable [ , variable ... ]
Każda z nich
variable
ma następującą składnię i części:variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With
{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]
Element opis variablename
Wymagane. Nazwa zmiennej. Zobacz Nazwy zadeklarowanych elementów. boundslist
Opcjonalny. Lista granic każdego wymiaru zmiennej tablicowej. New
Opcjonalny. Tworzy nowe wystąpienie klasy po uruchomieniu instrukcji Dim
.datatype
Opcjonalny. Typ danych zmiennej. With
Opcjonalny. Wprowadza listę inicjatora obiektów. propertyname
Opcjonalny. Nazwa właściwości w klasie, której wystąpienie jest tworzone. propinitializer
Wymagane po propertyname
=. Wyrażenie, które jest oceniane i przypisane do nazwy właściwości.initializer
Opcjonalnie, jeśli New
nie zostanie określony. Wyrażenie, które jest oceniane i przypisywane do zmiennej podczas jej tworzenia.
Uwagi
Kompilator języka Visual Basic używa Dim
instrukcji , aby określić typ danych zmiennej i inne informacje, takie jak kod, który może uzyskać dostęp do zmiennej. Poniższy przykład deklaruje zmienną Integer
do przechowywania wartości.
Dim numberOfStudents As Integer
Można określić dowolny typ danych lub nazwę wyliczenia, struktury, klasy lub interfejsu.
Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form
Jako typ odwołania należy użyć New
słowa kluczowego , aby utworzyć nowe wystąpienie klasy lub struktury określonej przez typ danych. Jeśli używasz metody New
, nie używasz wyrażenia inicjatora. Zamiast tego należy podać argumenty, jeśli są one wymagane, do konstruktora klasy, z której tworzysz zmienną.
Dim bottomLabel As New System.Windows.Forms.Label
Zmienną można zadeklarować w procedurze, bloku, klasie, strukturze lub module. Nie można zadeklarować zmiennej w pliku źródłowym, przestrzeni nazw lub interfejsie. Aby uzyskać więcej informacji, zobacz Konteksty deklaracji i Domyślne poziomy dostępu.
Zmienna zadeklarowana na poziomie modułu poza dowolną procedurą jest zmienną składową lub polem. Zmienne składowe są w zakresie w całej klasie, strukturze lub module. Zmienna zadeklarowana na poziomie procedury jest zmienną lokalną. Zmienne lokalne znajdują się w zakresie tylko w ramach ich procedury lub bloku.
Następujące modyfikatory dostępu są używane do deklarowania zmiennych poza procedurą: Public
, , Protected
Friend
, Protected Friend
, i Private
. Aby uzyskać więcej informacji, zobacz Poziomy dostępu w Visual Basic.
Słowo Dim
kluczowe jest opcjonalne i zwykle pomijane, jeśli określisz dowolny z następujących modyfikatorów: Public
, Friend
Shared
Protected Friend
Protected
Shadows
Static
Private
ReadOnly
lub .WithEvents
Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer
Jeśli Option Explicit
jest włączona (wartość domyślna), kompilator wymaga deklaracji dla każdej używanej zmiennej. Aby uzyskać więcej informacji, zobacz Opcja jawna instrukcja.
Określanie wartości początkowej
Wartość można przypisać do zmiennej podczas jej tworzenia. W przypadku typu wartości należy użyć inicjatora, aby podać wyrażenie, które ma zostać przypisane do zmiennej. Wyrażenie musi zostać obliczone na stałą, którą można obliczyć w czasie kompilacji.
Dim quantity As Integer = 10
Dim message As String = "Just started"
Jeśli określono inicjator i typ danych nie jest określony w klauzuli As
, wnioskowanie typu służy do wnioskowania typu typu z inicjatora. W poniższym przykładzie wartości i num1
num2
są silnie typizowane jako liczby całkowite. W drugiej deklaracji typ wnioskowania wywnioskuje typ z wartości 3.
' Use explicit typing.
Dim num1 As Integer = 3
' Use local type inference.
Dim num2 = 3
Wnioskowanie typu ma zastosowanie na poziomie procedury. Nie ma zastosowania poza procedurą w klasie, strukturze, module lub interfejsie. Aby uzyskać więcej informacji na temat wnioskowania typów, zobacz Instrukcje wnioskowania opcji i Wnioskowanie typu lokalnego.
Aby uzyskać informacje o tym, co się stanie, gdy typ danych lub inicjator nie zostanie określony, zobacz Domyślne typy danych i wartości w dalszej części tego tematu.
Za pomocą inicjatora obiektów można zadeklarować wystąpienia nazwanych i anonimowych typów. Poniższy kod tworzy wystąpienie Student
klasy i używa inicjatora obiektu do inicjowania właściwości.
Dim student1 As New Student With {.First = "Michael",
.Last = "Tucker"}
Aby uzyskać więcej informacji na temat inicjatorów obiektów, zobacz Instrukcje: deklarowanie obiektu za pomocą inicjatora obiektów, inicjatory obiektów: typy nazwane i anonimowe oraz typy anonimowe.
Deklarowanie wielu zmiennych
Można zadeklarować kilka zmiennych w jednej instrukcji deklaracji, określając nazwę zmiennej dla każdego z nich i postępując zgodnie z każdą nazwą tablicy nawiasami. Wiele zmiennych jest rozdzielonych przecinkami.
Dim lastTime, nextTime, allTimes() As Date
Jeśli zadeklarowasz więcej niż jedną zmienną z jedną As
klauzulą, nie można podać inicjatora dla tej grupy zmiennych.
Dla różnych zmiennych można określić różne typy danych, używając oddzielnej As
klauzuli dla każdej zadeklarowanej zmiennej. Każda zmienna przyjmuje typ danych określony w pierwszej As
klauzuli napotkanej po jej variablename
części.
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
Tablice
Można zadeklarować zmienną do przechowywania tablicy, która może przechowywać wiele wartości. Aby określić, że zmienna zawiera tablicę, postępuj zgodnie z nawiasami variablename
. Aby uzyskać więcej informacji na temat tablic, zobacz Tablice.
Można określić dolną i górną granicę każdego wymiaru tablicy. W tym celu uwzględnij wewnątrz boundslist
nawiasów. Dla każdego wymiaru boundslist
określa górną granicę i opcjonalnie dolną granicę. Dolna granica jest zawsze równa zero, bez względu na to, czy jest określona. Każdy indeks może się różnić od zera przez jego górną granicę.
Następujące dwie instrukcje są równoważne. Każda instrukcja deklaruje tablicę 21 Integer
elementów. Gdy uzyskujesz dostęp do tablicy, indeks może się różnić od 0 do 20.
Dim totals(20) As Integer
Dim totals(0 To 20) As Integer
Poniższa instrukcja deklaruje dwuwymiarową tablicę typu Double
. Tablica zawiera 4 wiersze (3 + 1) z 6 kolumn (5 + 1) każdy. Należy pamiętać, że górna granica reprezentuje najwyższą możliwą wartość indeksu, a nie długość wymiaru. Długość wymiaru jest górną granicą i jedną.
Dim matrix2(3, 5) As Double
Tablica może mieć wymiary od 1 do 32.
Wszystkie granice można pozostawić puste w deklaracji tablicy. Jeśli to zrobisz, tablica ma liczbę podanych wymiarów, ale jest niezainicjowana. Ma wartość , Nothing
dopóki nie zainicjujesz co najmniej niektórych jej elementów. Instrukcja Dim
musi określać granice dla wszystkich wymiarów lub bez wymiarów.
' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)
Jeśli tablica ma więcej niż jeden wymiar, należy uwzględnić przecinki między nawiasami, aby wskazać liczbę wymiarów.
Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte
Tablicę o zerowej długości można zadeklarować, deklarując jeden z wymiarów tablicy o wartości -1. Zmienna, która zawiera tablicę o zerowej długości, nie ma wartości Nothing
. Tablice o zerowej długości są wymagane przez niektóre funkcje środowiska uruchomieniowego języka wspólnego. Jeśli spróbujesz uzyskać dostęp do takiej tablicy, wystąpi wyjątek środowiska uruchomieniowego. Aby uzyskać więcej informacji, zobacz Tablice.
Wartości tablicy można zainicjować przy użyciu literału tablicy. W tym celu należy otoczyć wartości inicjowania nawiasami klamrowymi ({}
).
Dim longArray() As Long = {0, 1, 2, 3}
W przypadku tablic wielowymiarowych inicjowanie dla każdego oddzielnego wymiaru jest ujęte w nawiasy klamrowe w wymiarze zewnętrznym. Elementy są określone w kolejności głównej wiersza.
Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
Aby uzyskać więcej informacji na temat literałów tablicy, zobacz Tablice.
Domyślne typy danych i wartości
W poniższej tabeli opisano wyniki różnych kombinacji określania typu danych i inicjatora w instrukcji Dim
.
Określony typ danych? | Określony inicjator? | Przykład | Result |
---|---|---|---|
Nie | Nie. | Dim qty |
Jeśli opcja Strict jest wyłączona (wartość domyślna), zmienna jest ustawiona na Nothing .W przypadku Option Strict włączenia wystąpi błąd czasu kompilacji. |
Nie. | Tak | Dim qty = 5 |
Jeśli wywniosek opcji jest włączony (wartość domyślna), zmienna przyjmuje typ danych inicjatora. Zobacz Wnioskowanie typu lokalnego. Jeśli Option Infer wartość jest wyłączona i Option Strict wyłączona, zmienna pobiera typ Object danych .Jeśli Option Infer jest wyłączona i Option Strict jest włączona, wystąpi błąd czasu kompilacji. |
Tak | Nie. | Dim qty As Integer |
Zmienna jest inicjowana do wartości domyślnej dla typu danych. Zapoznaj się z tabelą w dalszej części tej sekcji. |
Tak | Tak | Dim qty As Integer = 5 |
Jeśli typ danych inicjatora nie jest konwertowany na określony typ danych, wystąpi błąd czasu kompilacji. |
Jeśli określisz typ danych, ale nie określisz inicjatora, program Visual Basic inicjuje zmienną na wartość domyślną dla jego typu danych. W poniższej tabeli przedstawiono domyślne wartości inicjowania.
Typ danych | Domyślna wartość |
---|---|
Wszystkie typy liczbowe (w tym Byte i SByte ) |
0 |
Char |
Binarne 0 |
Wszystkie typy odwołań (w tym Object , String i wszystkie tablice) |
Nothing |
Boolean |
False |
Date |
12:00 od 1 stycznia roku 1 (01.01.001.001 12:00:00 am) |
Każdy element struktury jest inicjowany tak, jakby był oddzielną zmienną. Jeśli deklarujesz długość tablicy, ale nie inicjujesz jej elementów, każdy element jest inicjowany tak, jakby był to oddzielna zmienna.
Statyczny okres istnienia zmiennej lokalnej
Zmienna lokalna Static
ma dłuższy okres istnienia niż procedura, w której jest zadeklarowana. Granice okresu istnienia zmiennej zależą od tego, gdzie jest zadeklarowana procedura i czy jest to Shared
.
Deklaracja procedury | Zainicjowana zmienna | Zmienna zatrzymuje istniejące |
---|---|---|
W module | Przy pierwszym wywołaniu procedury | Po zatrzymaniu wykonywania programu |
W klasie lub strukturze procedura jest Shared |
Przy pierwszym wywołaniu procedury w konkretnym wystąpieniu lub w samej klasie lub samej strukturze | Po zatrzymaniu wykonywania programu |
W klasie lub strukturze procedura nie jest Shared |
Przy pierwszym wywołaniu procedury w konkretnym wystąpieniu | Po wydaniu wystąpienia do odzyskiwania pamięci (GC) |
Atrybuty i modyfikatory
Atrybuty można stosować tylko do zmiennych członkowskich, a nie do zmiennych lokalnych. Atrybut współtworzy informacje o metadanych zestawu, które nie są istotne dla magazynu tymczasowego, takiego jak zmienne lokalne.
Na poziomie modułu Static
nie można użyć modyfikatora do deklarowania zmiennych członkowskich. Na poziomie procedury nie można użyć Shared
modyfikatorów dostępu , Shadows
, ReadOnly
WithEvents
lub żadnych modyfikatorów dostępu do deklarowania zmiennych lokalnych.
Możesz określić, jaki kod może uzyskać dostęp do zmiennej, podając accessmodifier
element . Zmienne składowe klasy i modułu (poza dowolną procedurą) są domyślne dla dostępu prywatnego i zmienne składowe struktury domyślne dla dostępu publicznego. Możesz dostosować ich poziomy dostępu za pomocą modyfikatorów dostępu. Nie można używać modyfikatorów dostępu do zmiennych lokalnych (wewnątrz procedury).
W ramach procedury można określić WithEvents
tylko zmienne składowe, a nie zmienne lokalne. Jeśli określisz WithEvents
, typ danych zmiennej musi być określonym typem klasy, a nie Object
. Nie można zadeklarować tablicy za pomocą WithEvents
polecenia . Aby uzyskać więcej informacji na temat zdarzeń, zobacz Zdarzenia.
Uwaga
Kod poza klasą, strukturą lub modułem musi kwalifikować nazwę zmiennej składowej o nazwie tej klasy, struktury lub modułu. Kod poza procedurą lub blokiem nie może odwoływać się do żadnych zmiennych lokalnych w ramach tej procedury lub bloku.
Zwalnianie zasobów zarządzanych
Moduł odśmiecający elementy bezużyteczne programu .NET Framework usuwa zasoby zarządzane bez konieczności dodatkowego kodowania w danej części. Można jednak wymusić usunięcie zarządzanego zasobu zamiast czekać na moduł odśmiecenia pamięci.
Jeśli klasa trzyma się szczególnie cennego i ograniczonego zasobu (takiego jak połączenie z bazą danych lub uchwyt pliku), możesz nie chcieć poczekać na następne odzyskiwanie pamięci, aby wyczyścić wystąpienie klasy, które nie jest już używane. Klasa może zaimplementować IDisposable interfejs, aby zapewnić sposób zwalniania zasobów przed odzyskiwaniem pamięci. Klasa, która implementuje ten interfejs, uwidacznia metodę Dispose
, którą można wywołać, aby wymusić natychmiastowe zwolnienie cennych zasobów.
Instrukcja Using
automatyzuje proces uzyskiwania zasobu, wykonywania zestawu instrukcji, a następnie usuwania zasobu. Jednak zasób musi implementować IDisposable interfejs. Aby uzyskać więcej informacji, zobacz Using Statement (Używanie instrukcji).
Przykład 1
Poniższy przykład deklaruje zmienne przy użyciu instrukcji Dim
z różnymi opcjami.
' 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}
Przykład 2
W poniższym przykładzie wymieniono liczby pierwsze z zakresu od 1 do 30. Zakres zmiennych lokalnych jest opisany w komentarzach kodu.
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
Przykład 3
W poniższym przykładzie zmienna speedValue
jest zadeklarowana na poziomie klasy. Słowo Private
kluczowe służy do deklarowania zmiennej. Dostęp do zmiennej Car
można uzyskać za pomocą dowolnej procedury w klasie .
' 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
Zobacz też
- Const, instrukcja
- ReDim, instrukcja
- Option Explicit, instrukcja
- Option Infer, instrukcja
- Option Strict, instrukcja
- Strona kompilowania, Projektant projektu (Visual Basic)
- Deklaracja zmiennej
- Tablice
- Inicjatory obiektów: typy nazwane i anonimowe
- Typy anonimowe
- Inicjatory obiektów: typy nazwane i anonimowe
- Instrukcje: deklarowanie obiektu za pomocą inicjatora obiektów
- Wnioskowanie o typie lokalnym