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, , ProtectedFriend, 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, FriendSharedProtected FriendProtectedShadowsStaticPrivateReadOnlylub .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 num1num2 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 Objectdanych .

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, Stringi 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ć Sharedmodyfikatorów dostępu , Shadows, ReadOnlyWithEventslub żadnych modyfikatorów dostępu do deklarowania zmiennych lokalnych.

Możesz określić, jaki kod może uzyskać dostęp do zmiennej, podając accessmodifierelement . 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ą WithEventspolecenia . 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ż