Dim 陳述式 (Visual Basic)
更新:2007 年 11 月
為一個或多個變數宣告和配置儲存空間。
[ <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
必要項。變數名稱。請參閱宣告項目名稱。
boundslist
選擇項。列出陣列變數每個維度 (Dimension) 的界限。
New
選擇項。在執行 Dim 陳述式時建立新的類別執行個體。
datatype
如果 Option Strict 為 On,則為必要項。變數的資料型別。
With
選擇項。引入物件初始設定式清單。
propertyname
選擇項。要建立執行個體的類別中某個屬性的名稱。
propinitializer
propertyname = 之後的必要項目。要評估並指派給屬性名稱的運算式。
initializer
如果未指定 New,則為選擇項。在建立時,評估並指派給變數的運算式。
備註
您應該宣告要在程式中使用的每一個變數,告知 Visual Basic 編譯器 (Compiler) 關於變數的資料型別和其他資訊 (例如哪些程式碼可以存取它)。下列範例會宣告變數存放 Integer 值。
Dim numberOfStudents As Integer
Dim 只能用於模組或程序層級。這表示變數的「宣告內容」(Declaration Context) 必須是類別、結構、模組、程序或區塊,且不可以是原始程式檔 (Source File)、命名空間 (Namespace) 或介面。如需詳細資訊,請參閱宣告內容和預設存取層級。
如果 Option Explicit 為 On (預設值),則編譯器會要求您宣告所要使用的每一個變數。如果您設定為 Option Explicit Off,則每個未宣告的變數都會預設值為 Object 資料型別,而這可能不是您想要的結果。
您可以在 Dim 陳述式中指定每個變數的資料型別,還可以指定初始值。如果未指定,則 Visual Basic 會使用預設值。如需詳細資訊,請參閱這個說明網頁之「詳細資訊」下的「資料型別規則」和「預設值」。下列範例會宣告並初始化 String 變數。
Dim summary As String = "Summary of results"
您可以在 Dim 陳述式中提供 accessmodifier,藉以指定哪些程式碼可以存取變數。如需詳細資訊,請參閱這個說明網頁之「詳細資訊」下的「修飾詞」和「存取層級」。
您可以宣告變數以儲存「陣列」(Array),陣列可以存放多個值。如需詳細資訊,請參閱這個說明網頁之「詳細資訊」下的「陣列規則」。如需陣列的詳細資訊,請參閱 Visual Basic 中的陣列。下列範例會宣告 Integer 陣列變數。
Dim days() As Integer
一般而言,所有的 Dim 陳述式都應該置於會使用變數的程式碼區域的開頭。如需詳細資訊,請參閱這個說明網頁之「詳細資訊」下的「疑難排解」。
Visual Basic 2008 引入物件初始設定式,用來宣告具名和匿名型別的執行個體,以及區域型別推斷。如需詳細資訊,請參閱匿名型別、物件初始設定式:具名和匿名型別和區域型別推斷。
詳細資訊
本節涵蓋下列概念的詳細資訊:
宣告
資料型別
陣列
行為
疑難排解
宣告規則
宣告內容:在模組層級宣告的變數 (不屬於任何程序) 即為「成員變數」(Member Variable) 或「欄位」(Field),屬於宣告它的類別、結構、或模組的成員。
在程序層級宣告的變數即為「區域變數」(Local Variable),只能在宣告它的程序或區塊中使用。
屬性:屬性只能套用到成員變數,不能套用到區域變數。屬性會提供資訊給組件的中繼資料 (Metadata),而這對於像區域變數的暫時儲存區而言不具意義。
隱含使用 Dim:如果您指定了 Public、Protected、Friend、Protected Friend、Private、Shared、Shadows、Static、ReadOnly 或 WithEvents 修飾詞,則可以選擇省略 Dim 關鍵字。
Public maximumAllowed As Double Protected Friend currentUserName As String Private salary As Decimal Static runningTotal As Integer
在模組層級中,您無法使用 Static 修飾詞宣告成員變數。在程序層級中,您無法使用 Shared、Shadows、ReadOnly、WithEvents 或任何存取修飾詞來宣告區域變數。
WithEvents 變數:您只能在成員變數上指定 WithEvents,而不能在程序內的區域變數上指定它。
如果指定 WithEvents,則變數的資料型別必須是特定的類別型別,而不是 Object。您無法以 WithEvents 宣告陣列。
如需事件的詳細資訊,請參閱事件和事件處理常式。
多個變數:同一個宣告陳述式中可以宣告多個變數,方式便是為每個變數指定 variablename 部分,然後在每個陣列名稱後加上括號。變數之間以逗號 ( , ) 來分隔。
Dim lastTime, nextTime, allTimes() As Date
資料型別規則
資料型別:Dim 陳述式可以宣告變數的資料型別。您可以指定任何資料型別,或列舉型別、結構、類別或介面的名稱。
Dim finished As Boolean Dim monitorBox As System.Windows.Forms.Form
預設型別:如果不指定 datatype,則變數會使用 initializer 的資料型別。根據預設,如果既不指定 datatype,也不指定 initializer,則資料型別為 Object 資料型別。如果同時指定 datatype 和 initializer,則 initializer 的資料型別必須可以轉換為 datatype。
不同型別:您可以為不同的變數指定不同的型別,方法便是為每個宣告的變數各使用一個 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
初始設定:Dim 陳述式可以初始化 variablelist 中選取之變數的內容。若是實值型別,您可以使用 initializer 提供要指派給變數的運算式。運算式必須評估為可在編譯時期計算的常數。
Dim quantity As Integer = 10 Dim message As String = "Just started"
若是參考型別,您可以使用 New 關鍵字,建立 datatype 指定之類別或結構的新執行個體。如果使用 New,則不需要使用 initializer 運算式。不過,您必須提供必要的引數給要在其中建立變數之類別的建構函式 (Constructor)。
Dim bottomLabel As New System.Windows.Forms.Label
如果以同一個 As 子句宣告一個以上的變數,則您無法為該變數群組提供 initializer。
陣列規則
陣列變數:若要指定 variablelist 中的某個變數為陣列,請緊接著在它的 variablename 後面加上括號。如果陣列具有一個以上的維度,則必須在括號內加入逗號表示維度的數目。
Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte
一個陣列可擁有 1 到 32 個維度。
如需詳細資訊,請參閱 Visual Basic 中的陣列。
陣列界限:您可以指定每個維度的下限和上限 (Upper Bound)。若要這麼做,請在括號內加入 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
請注意,所謂的上限是指該索引可能的最高值,而不是該維度的長度 (長度是上限加一)。
空白陣列界限:您可以將陣列宣告中的所有界限留空。如果這樣做,陣列會有您指定的維度數,但是還沒初始化。因此,它的值會是 Nothing,直到您至少初始化部分項目。Dim 陳述式必須指定所有維度的界限,或完全不指定。
Dim messages() As String
空白陣列:您可以使用 -1 宣告陣列維度的上限。這表示陣列是空的,但並非 Nothing,有些 Common Language Runtime 函式需要有這種區別。但是,Visual Basic 程式碼無法存取這類陣列。如果您嘗試這樣做,執行時就會發生 IndexOutOfRangeException 錯誤。如需詳細資訊,請參閱 HOW TO:建立沒有元素的陣列。
陣列初始設定:您可以用大括號 ({}) 括住初始值,藉以初始化陣列的值。
Dim longArray() As Long = {0, 1, 2, 3}
若是多維陣列,則每個個別維度的初始設定會以外層維度中的大括號括住。元素是以資料列為主要順序來指定。
Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
行為
預設值:如果不為變數指定 initializer,則 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)
結構的每個項目都會被視為個別的變數加以初始化。如果您宣告陣列的長度,但未初始化陣列的元素,則每個元素都會被視為個別的變數加以初始化。
存取層級:程序外的類別和模組成員變數預設為私用存取,而結構成員變數預設為公用存取。您可以使用存取修飾詞調整存取層級。您不能對程序內的區域變數使用存取修飾詞。
範圍:區域變數的範圍只限於所在的程序或區塊。成員變數的範圍則廣及整個類別、結構或模組。
限定性條件:類別、結構或模組外的程式碼必須以該類別、結構或模組的名稱限定成員變數的名稱。程序或區塊外的程式碼無法參考該程序或區塊內的區域變數。
存留期 (Lifetime):Static 區域變數的存留期比宣告它的程序長。變數的存留期範圍取決於程序的宣告位置和它是否為 Shared。
程序宣告
初始化變數
變數不再存在
在模組中
第一次呼叫程序時
程式停止執行時
在類別或結構中,Shared
第一次以特定執行個體或以類別或結構本身呼叫程序時
程式停止執行時
在類別或結構中,不是 Shared
第一次以特定執行個體呼叫程序時
當執行個體釋出以進行記憶體回收 (GC) 時
疑難排解
執行順序:Dim 陳述式本身並非執行陳述式。不過,如果它初始化一個或多個變數,初始設定就會被視為指派陳述式 (Assignment Statement)。這表示變數的值會經歷下列步驟:
第一次進入宣告變數的程式碼項目時,Visual Basic 會將它初始化為資料型別的預設值。
當執行到變數的 Dim 陳述式時,Visual Basic 會將它初始化為 Dim 陳述式中提供的值。
當執行回變數的 Dim 陳述式時,Visual Basic 會再次將它設為 Dim 陳述式中提供的值。
當您使用 Dim 陳述式初始化變數時,這具有下列意涵:
如果您在執行 Dim 陳述式之前就使用變數,則該變數的值將是資料型別的預設值,而不是 Dim 陳述式中提供的值。
如果永遠執行不到 Dim 陳述式,則該變數永遠不會初始化為 Dim 陳述式中提供的值。
如果您變更值之後又返回 Dim 陳述式,則變更後的值會以 Dim 陳述式中提供的值取代。
如果您將所有 Dim 陳述式置於其所在程式碼區域 (例如模組或程序) 的開頭,則程式碼會依您預期的方式初始化這些陳述式。
範例
下列範例會使用 Dim 陳述式搭配各種選項來宣告變數。
' The following statement declares and initializes a Long variable.
Dim startingAmount As Long = 500
' The following statement declares a variable that refers to a Button
' object, creates a new Button object, and assigns it to the variable.
Dim switchButton As New System.Windows.Forms.Button
' The following statement declares a variable that can only be
' accessed by code in the same class, structure, or module.
Private homeTelephone As String = ""
' The following statement declares a local variable that always retains
' its value, even after its procedure returns to the calling code.
Static totalSales As Double
' The following statement declares a variable that refers to an array.
Dim highTemperature(31) As Integer
' The following statement declares and initializes an array variable
' that holds 4 Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}