宣告並配置一或多個變數的儲存空間。
語法
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist
組件
attributelist選擇性。 請參閱屬性清單。
accessmodifier選擇性。 可以是下列其中一項:
Shared選擇性。 請參閱 Shared。
Shadows選擇性。 請參閱 Shadows。
Static選擇性。 請參閱 靜態。
ReadOnly選擇性。 請參閱 ReadOnly。
WithEvents選擇性。 指定這些是參考可引發事件之類別實例的物件變數。 請參閱 WithEvents。
variablelist必須的。 要在此語句中宣告的變數清單。
variable [ , variable ... ]每個
variable都具有下列語法和組件:variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]部分 說明 variablename必須的。 變數的名稱。 請參閱 宣告的項目名稱。 boundslist選擇性。 陣列變數之每個維度的界限清單。 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,則不會使用初始化表達式表達式。 相反地,您可以將自變數提供給您要從中建立變數之類別的建構函式。
Dim bottomLabel As New System.Windows.Forms.Label
您可以在程式、區塊、類別、結構或模組中宣告變數。 您無法在來源檔案、命名空間或介面中宣告變數。 如需詳細資訊,請參閱 宣告內容和預設存取層級。
在模組層級宣告的變數,在任何程式之外,都是 成員變數 或 字段。 成員變數的範圍在類別、結構或模組中。 在程式層級宣告的變數是 局部變數。 局部變數只位於其程式或區塊的範圍內。
下列存取修飾詞可用來宣告程式外部的變數:Public、、ProtectedFriend、Protected Friend、 和 Private。 如需詳細資訊,請參閱 Visual Basic中的存取層級。
Dim如果您指定下列任何修飾詞,關鍵詞是選擇性的,而且通常省略:Public、Protected、SharedStaticProtected FriendShadowsPrivateFriend、 ReadOnly或 。WithEvents
Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer
如果 Option Explicit 為 開啟 (預設值),編譯程式會針對您使用的每個變數要求宣告。 如需詳細資訊,請參閱 Option Explicit 語句。
指定初始值
您可以在建立變數時將值指派給變數。 針對實值型別,您可以使用 初始化運算式 來提供要指派給變數的表達式。 表達式必須評估為可在編譯時期計算的常數。
Dim quantity As Integer = 10
Dim message As String = "Just started"
如果指定初始化表達式,而且子句中 As 未指定數據類型,則會使用型別 推斷 從初始化表達式推斷數據類型。 在下列範例中,num1 和 num2 都是強型別為整數。 在第二個宣告中,類型推斷會從值 3 推斷類型。
' Use explicit typing.
Dim num1 As Integer = 3
' Use local type inference.
Dim num2 = 3
類型推斷適用於程式層級。 它不適用於類別、結構、模組或介面中的程式外部。 如需類型推斷的詳細資訊,請參閱 Option Infer 語句 和 本機類型推斷。
如需未指定數據類型或初始化表達式時會發生什麼情況的詳細資訊,請參閱本主題稍後 的預設數據類型和值 。
您可以使用 物件初始化表達式 來宣告具名和匿名型別的實例。 下列程式代碼會建立 類別的 Student 實例,並使用物件初始化表達式來初始化屬性。
Dim student1 As New Student With {.First = "Michael",
.Last = "Tucker"}
如需物件初始化表達式的詳細資訊,請參閱 如何:使用物件初始化表達式宣告物件、 物件初始化表達式:具名和匿名型別,以及 匿名型別。
宣告多個變數
您可以在一個宣告語句中宣告數個變數、為每個變數指定變數名稱,並以括號追蹤每個數位名稱。 多個變數會以逗號分隔。
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
陣列
您可以宣告變數來保存陣列,而 陣列可以保存多個值。 若要指定變數保存陣列,請緊接著其 variablename 括弧。 如需有關陣列的詳細資訊,請參閱 陣列。
您可以指定數位每個維度的下限和上限。 若要這樣做,請在括弧內包含 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,以宣告 長度為零的陣列 。 保留零長度陣列的變數沒有 值 Nothing。 某些 Common Language Runtime 函式需要長度為零的陣列。 如果您嘗試存取這類陣列,就會發生運行時例外狀況。 如需詳細資訊,請參閱陣列。
您可以使用數位常值來初始化陣列的值。 若要這樣做,請以大括弧 ({}) 括住初始化值。
Dim longArray() As Long = {0, 1, 2, 3}
對於多維度陣列,每個個別維度的初始化會以大括弧括住在外部維度中。 元素會以數據列主要順序指定。
Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
如需數位常值的詳細資訊,請參閱 陣列。
默認數據類型和值
下表描述在語句中 Dim 指定數據類型和初始化表達式的各種組合結果。
| 指定的數據類型? | 指定的初始化表達式? | 範例 | 結果 |
|---|---|---|---|
| 否 | 否 | Dim qty |
如果 Option Strict 為 off (預設值),變數會設定為 Nothing。如果 Option Strict 為 開啟,就會發生編譯時期錯誤。 |
| 否 | 是的 | Dim qty = 5 |
如果 Option Infer 開啟 (預設值),變數會採用初始化表達式的數據類型。 請參閱 本機類型推斷。 如果 Option Infer 為 off 且 Option Strict 為 off,則變數會採用 的 Object數據類型。如果 Option Infer 已關閉且 Option Strict 開啟,則會發生編譯時間錯誤。 |
| 是的 | 否 | Dim qty As Integer |
變數會初始化為數據類型的預設值。 請參閱本節稍後的表格。 |
| 是的 | 是的 | Dim qty As Integer = 5 |
如果初始化表達式的數據類型無法轉換成指定的數據類型,就會發生編譯時期錯誤。 |
如果您指定數據類型但未指定初始化表達式,Visual Basic 會將變數初始化為其數據類型的預設值。 下表顯示預設初始化值。
| 數據類型 | 預設值 |
|---|---|
所有數值型態 (包括 Byte ) SByte |
0 |
Char |
二進位 0 |
所有參考型別(包括 Object、 String與所有數位列 ) |
Nothing |
Boolean |
False |
Date |
1 月 1 日上午 12:00 (上午 01/01/0001 上午 12:00:00) |
結構的每個元素都會初始化,就像是個別的變數一樣。 如果您宣告陣列的長度,但不初始化其元素,則會初始化每個元素,就好像它是個別的變數一樣。
靜態局部變數存留期
Static局部變數的存留期比宣告程式的存留期更長。 變數存留期的界限取決於宣告程式的位置,以及其是否為 Shared。
| 程式宣告 | 變數已初始化 | 變數會停止現有的 |
|---|---|---|
| 在模組中 | 第一次呼叫程式時 | 當您的程式停止執行時 |
在類別或結構中,程式為 Shared |
第一次在特定實例或類別或結構本身上呼叫程式 | 當您的程式停止執行時 |
在類別或結構中,程式不是 Shared |
第一次在特定實例上呼叫程式 | 當實例被釋放以便進行垃圾收集時 (GC) |
屬性和修飾詞
您只能將屬性套用至成員變數,而不是套用至局部變數。 屬性會提供元件元數據的資訊,這對暫存記憶體而言沒有意義,例如局部變數。
在模組層級,您無法使用 Static 修飾詞來宣告成員變數。 在程式層級,您無法使用 Shared、Shadows、、 ReadOnlyWithEvents或任何存取修飾詞來宣告局部變數。
您可以藉由提供 accessmodifier來指定哪些程式代碼可以存取變數。 類別和模組成員變數 (任何程式外部) 預設為私用存取,而結構成員變數預設為公用存取。 您可使用存取修飾詞來調整其存取層級。 您無法在局部變數上使用存取修飾詞(在程式內)。
您只能在成員變數上指定 WithEvents ,而不是在程式內的局部變數上指定。 如果您指定 WithEvents,變數的數據類型必須是特定的類別類型,而不是 Object。 您無法使用 WithEvents宣告陣列。 如需事件的詳細資訊,請參閱 事件。
備註
類別、結構或模組以外的程式代碼必須以該類別、結構或模組的名稱來限定成員變數的名稱。 程式或區塊以外的程式代碼無法參考該程式或區塊內的任何局部變數。
釋放受控資源
.NET Framework 垃圾收集行程會處置 Managed 資源,而不需要任何額外的程序代碼。 不過,您可以強制處置受控資源,而不是等候垃圾收集行程。
如果類別保留特別有價值且稀缺的資源(例如資料庫連線或檔句柄),您可能不想等到下一個垃圾收集,以清除不再使用的類別實例。 類別可以實作 IDisposable 介面,以提供在垃圾收集之前釋放資源的方式。 實作該介面的類別會 Dispose 公開可呼叫的方法,以強制立即釋放寶貴的資源。
Using語句會將取得資源、執行一組語句,然後處置資源的程序自動化。 不過,資源必須實作 IDisposable 介面。 如需詳細資訊,請參閱 Using 陳述式。
範例 1
下列範例會使用 Dim 語句搭配各種選項來宣告變數。
' 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}
範例 2
下列範例會列出介於 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
範例 3
在下列範例中, 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