Dim 陳述式 (Visual Basic)

為一個或多個變數宣告和配置儲存空間。

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

組件

詞彙

定義

attributelist

選擇項。 請參閱屬性清單

accessmodifier

選擇項。 可以是下列其中一項:

請參閱Visual Basic 中的存取層級

Shared

選擇項。 請參閱 Shared

Shadows

選擇項。 請參閱 Shadows

Static

選擇項。 請參閱 Static

ReadOnly

選擇項。 請參閱 ReadOnly

WithEvents

選擇項。 指定這些物件變數是參考可以引發事件的類別執行個體。 請參閱 WithEvents

variablelist

必要項。 這個陳述式中要宣告的變數清單。

variable [ , variable ... ]

每個 variable 都具有下列語法和組成部分:

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

組件描述
variablename 必要項。變數名稱。請參閱宣告項目名稱 (Visual Basic)
boundslist 選擇項。列出陣列變數每個維度 (Dimension) 的界限。
New 選擇項。在執行 Dim 陳述式時建立新的類別執行個體。
datatype 選擇項。變數的資料型別。
With 選擇項。引入物件初始設定式清單。
propertyname 選擇項。要建立執行個體的類別中某個屬性的名稱。
propinitializer propertyname = 之後的必要項目。要評估並指派給屬性名稱的運算式。
initializer 如果未指定 New,則為選擇項。在建立時,評估並指派給變數的運算式。

備註

Visual Basic 編譯器會使用 Dim 陳述式來決定變數的資料型別及其他資訊,例如哪些程式碼可以存取該變數。 下列範例會宣告變數存放 Integer 值。

Dim numberOfStudents As Integer

您可以指定任何資料型別,或列舉型別、結構、類別或介面的名稱。

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

若是參考型別,您可以使用 New 關鍵字,建立資料型別指定之類別或結構的新執行個體。 如果使用 New,則不需要使用初始設定式運算式。 不過,您必須提供必要的引數給要在其中建立變數之類別的建構函式 (Constructor)。

Dim bottomLabel As New System.Windows.Forms.Label

您可以在程序、區塊、類別、結構或模組中宣告變數。 您無法在原始程式檔、命名空間或介面中宣告變數。 如需詳細資訊,請參閱宣告內容和預設存取層級 (Visual Basic)

在任何程序之外,於模組層級宣告的變數即是「成員變數」(Member Variable) 或「欄位」(Field)。 成員變數的範圍則廣及整個類別、結構或模組。 在程序層次宣告的變數是「區域變數」(Local Variable)。 區域變數的範圍只限於所在的程序或區塊。

下列存取修飾詞是用於宣告程序外部的變數:Public、Protected、Friend、Protected Friend 和 Private。 如需詳細資訊,請參閱Visual Basic 中的存取層級

如果您指定下列任何一個修飾詞,則 Dim 關鍵字是選擇性的,而且通常會省略:Public、Protected、Friend、Protected Friend、Private、Shared、Shadows、Static、ReadOnly 或 WithEvents。

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

如果 Option Explicit 為 On (預設值),則編譯器會要求您宣告所要使用的每一個變數。 如需詳細資訊,請參閱Option Explicit 陳述式 (Visual Basic)

指定初始值

您可以在建立變數時指派其值。 若是實值型別,您可以使用「初始設定式」(Initializer) 提供要指派給變數的運算式。 運算式必須評估為可在編譯時期計算的常數。

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

如果已指定初始設定式,但未在 As 子句中指定資料型別,則會使用「型別推斷」(Type Inference),從初始設定式推斷資料型別。 在下列範例中,num1 和 num2 都會強型別為整數。 在第二個宣告中,型別推斷會從 3 的值推斷型別。

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

型別推斷適用於程序層次。 它不適用於類別、結構、模組或介面的程序以外。 如需關於型別推斷的詳細資訊,請參閱Option Infer 陳述式區域型別推斷 (Visual Basic).

如需未指定資料型別或初始設定式時會發生什麼情況的詳細資訊,請參閱本主題稍後的預設資料型別及值

您可以使用「物件初始設定式」(Object Initializer) 宣告具名和匿名型別的執行個體。 下列程式碼會建立 Student 類別的執行個體,並使用物件初始設定式來初始化屬性。

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

如需物件初始設定式的詳細資訊,請參閱 HOW TO:使用物件初始設定式宣告物件 (Visual Basic)物件初始設定式:具名和匿名型別 (Visual Basic)匿名型別 (Visual Basic)

宣告多個變數

您可以在一個宣告陳述式中宣告多個變數,做法是為每個變數指定變數名稱,然後在每個陣列名稱後面加上括號。 變數之間以逗號 ( , ) 來分隔。

Dim lastTime, nextTime, allTimes() As Date

如果以 As 子句宣告一個以上的變數,則您無法提供該變數群組的初始設定式。

您可以為不同的變數指定不同的型別,方法便是為每個宣告的變數各使用一個 As 子句。 每個變數都會使用 variablename 部分後遭遇之第一個 As 子句中指定的資料型別。

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

陣列

您可以宣告變數以儲存「陣列」(Array),陣列可以存放多個值。 若要指定變數儲存陣列,請緊接在其 variablename 後面加上括號。 如需陣列的詳細資訊,請參閱 Visual Basic 中的陣列

您可以指定陣列每個維度的下限和上限。 若要這麼做,請在括號內加入 boundslist。 boundslist 會指定每個陣列的上限和選擇性地指定下限。 不論您是否指定下限,下限一律為零。 每個索引都可以是從零到其上限值的值。

下列兩個陳述式的用法是相同的。 每個陳述式都宣告具有 21 個 Integer 元素的陣列。 當您存取陣列時,索引可以是從 0 到 20 的值。

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

下列陳述式會宣告型別為 Double 的二維陣列。 這個陣列共有 4 列 (3 + 1),每列各有 6 行 (5 + 1)。 請注意,所謂的上限是指該索引可能的最高值,而不是該維度的長度。 維度的長度是上限加一。

Dim matrix2(3, 5) As Double

一個陣列可擁有 1 到 32 個維度。

您可以將陣列宣告中的所有界限留空。 如果這樣做,陣列會有您指定的維度數,但是還沒初始化。 它的值都會是 Nothing,直到您至少初始化部分項目為止。 Dim 陳述式必須指定所有維度的界限,或完全不指定。

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

如果陣列具有一個以上的維度,則必須在括號內加入逗號表示維度的數目。

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

您可以將陣列的其中一個維度宣告為 -1,宣告「零長度陣列」(Zero-length Array)。 含有長度為零的陣列的變數並不會具有 Nothing 值。 某些 Common Language Runtime 函式需要使用零長度陣列。 如果您嘗試存取此類陣列,則會發生執行階段例外狀況。 如需詳細資訊,請參閱Visual Basic 中的陣列

您可以使用陣列常值初始化陣列的值。 若要做到這一點,請將初始設定值放在大括號 ({}) 之中。

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

若是多維陣列,則每個個別維度的初始設定會以外層維度中的大括號括住。 元素是以資料列為主要順序來指定。

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

如需陣列常值的詳細資訊,請參閱 Visual Basic 中的陣列

預設資料型別及值

下表說明各種在 Dim 陳述式中指定資料型別與初始設定式之組合的結果。

資料型別已指定?

是否已指定初始設定式?

範例

結果

Dim qty

如果Option Strict 是 Off(預設值),則變數會設為Nothing.

如果 Option Strict 為 On,則會發生編譯時期錯誤。

Dim qty = 5

如果選項推斷 是 On(預設值),變數會採用初始設定式的資料類型。 請參閱區域型別推斷 (Visual Basic)

如果 Option Infer 為 Off 且 Option Strict 為 Off,則變數會使用 Object 的資料型別。

如果 Option Infer 為 Off,而 Option Strict 為 On,則會發生編譯時期錯誤。

Dim qty As Integer

變數會初始化為資料型別的預設值。 請參閱本節稍後的表格。

Dim qty As Integer = 5

如果初始設定式的資料型別無法轉換為指定的資料型別,就會發生編譯時期錯誤。

如果您指定資料型別但未指定初始設定式,則 Visual Basic 會將變數初始化為資料型別的預設值。 下表顯示預設初始設定值。

資料型別

預設值

所有數字型別 (包括 Byte 和 SByte)

0

Char

二進位 0

所有參考型別 (包括 Object、String 和所有陣列)

Nothing

Boolean

False

Date

1 年 1 月 1 日的 12:00 AM (01/01/0001 12:00:00 AM)

結構的每個項目都會被視為個別的變數加以初始化。 如果您宣告陣列的長度,但未初始化陣列的元素,則每個元素都會被視為個別的變數加以初始化。

靜態區域變數存留期

Static 區域變數的存留期比宣告它的程序長。 變數的存留期範圍取決於程序的宣告位置和它是否為 Shared。

程序宣告

初始化變數

變數停止存在

在模組中

第一次呼叫程序時

程式停止執行時

在 Shared 類別或結構中

第一次以特定執行個體或以類別或結構本身呼叫程序時

程式停止執行時

在並非 Shared 的類別或結構中

第一次以特定執行個體呼叫程序時

當執行個體釋出以進行記憶體回收 (GC) 時

屬性和修飾詞

屬性只能套用到成員變數,不能套用到區域變數。 屬性會提供資訊給組件的中繼資料 (Metadata),而這對於像區域變數的暫時儲存區而言不具意義。

在模組層級中,您無法使用 Static 修飾詞宣告成員變數。 在程序層級中,您無法使用 Shared、Shadows、ReadOnly、WithEvents 或任何存取修飾詞來宣告區域變數。

您可以提供 accessmodifier,指定可存取變數的程式碼。 程序外的類別和模組成員變數預設為私用存取,而結構成員變數預設為公用存取。 您可以使用存取修飾詞調整存取層級。 您不能對程序內的區域變數使用存取修飾詞。

您只能在成員變數上指定 WithEvents,而不能在程序內的區域變數上指定它。 如果指定 WithEvents,則變數的資料型別必須是特定的類別型別,而不是 Object。 您無法以 WithEvents 宣告陣列。 如需事件的詳細資訊,請參閱事件 (Visual Basic)

注意事項注意事項

類別、結構或模組外的程式碼必須以該類別、結構或模組的名稱限定成員變數的名稱。 程序或區塊外的程式碼無法參考該程序或區塊內的區域變數。

範例

下列範例會使用 Dim 陳述式搭配各種選項來宣告變數。

' Declare and initialize a Long variable.
Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object,
' create a Button object, and assign the Button object
' to the variable.
Dim switchButton As New System.Windows.Forms.Button

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

下列範例會列出介於 1 和 30 之間的質數。 區域變數的範圍在程式碼註解中有說明。

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

在下列範例中,speedValue 變數是在類別層級宣告的。 Private 關鍵字的用途在於宣告變數。 Car 類別中的任何程序都可以存取該變數。

' 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

請參閱

工作

HOW TO:宣告匿名型別的執行個體 (Visual Basic)

HOW TO:使用物件初始設定式宣告物件 (Visual Basic)

參考

Const 陳述式 (Visual Basic)

ReDim 陳述式 (Visual Basic)

Option Explicit 陳述式 (Visual Basic)

Option Infer 陳述式

Option Strict 陳述式

專案設計工具、編譯頁 (Visual Basic)

概念

Visual Basic 中的變數宣告

Visual Basic 中的陣列

物件初始設定式:具名和匿名型別 (Visual Basic)

匿名型別 (Visual Basic)

物件初始設定式:具名和匿名型別 (Visual Basic)

區域型別推斷 (Visual Basic)

變更記錄

日期

記錄

原因

2011 年 1 月

已重新組織備註、加入範例,並進行其他變更。

資訊加強。