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
可选。列出数组变量的每个维的界限。
New
可选。运行 Dim 语句时创建该类的新实例。
datatype
如果 Option Strict 为 On,则为必选项。变量的数据类型。
With
可选。引入对象初始值设定项列表。
propertyname
可选。您正在为其创建实例的类中的属性名称。
propinitializer
必须在 propertyname = 后面使用。计算并赋值给属性名的表达式。
initializer
如果未指定 New,则为可选项。创建时计算并赋值给变量的表达式。
备注
您应当声明程序中使用的每个变量,以通知 Visual Basic 编译器变量的数据类型和其他信息(例如哪些代码可以访问它)。下面的示例声明一个存放 Integer 值的变量。
Dim numberOfStudents As Integer
只能在模块或过程级别使用 Dim。这意味着变量的声明上下文必须是类、结构、模块、过程或块,而不能是源文件、命名空间或接口。有关更多信息,请参见声明上下文和默认访问级别。
如果 Option Explicit 为 On(默认值),编译器将要求声明您使用的每个变量。如果指定 Option Explicit Off,则每个未声明变量的默认值为 Object 数据类型,该默认值可能不是您需要的值。
您可以在 Dim 语句中指定每个变量的数据类型。您也可以指定一个初始值。如果不指定,Visual Basic 将使用默认设置。有关更多信息,请参见本帮助页中“详细信息”下的“数据类型规则”和“默认值”。下面的示例声明并初始化一个 String 变量。
Dim summary As String = "Summary of results"
您可以通过在 Dim 语句中提供一个 accessmodifier 来指定哪些代码可以访问变量。有关更多信息,请参见本帮助页中“详细信息”下的“修饰符”和“访问级别”。
您可以声明一个存放数组的变量,而数组可以存放多个值。有关更多信息,请参见本帮助页中“详细信息”下的“数组规则”。有关数组的更多信息,请参见数组 (Visual Basic)。下面的示例声明一个 Integer 数组变量。
Dim days() As Integer
通常,应该将所有 Dim 语句放在使用变量的代码区域的开头。有关更多信息,请参见本帮助页中“详细信息”下的“疑难解答”。
Visual Basic 2008 引入了对象初始值设定项,用于声明命名类型和匿名类型的实例以及局部类型引用。有关更多信息,请参见匿名类型、对象初始值设定项:命名类型和匿名类型和局部类型推理。
详细信息
本节涵盖以下方面的详细信息:
声明
数据类型
数组
行为
疑难解答
声明规则
**声明上下文。**在模块级别声明的、位于任何过程以外的变量是成员变量或字段;它是声明它的类、结构或模块的成员。
在过程级别声明的变量是局部变量;它位于声明它的过程或块的本地。
**属性。**您可以将属性仅应用于成员变量,而不应用于局部变量。属性向程序集的元数据提供信息,这对于临时存储(如局部变量)来说并没有意义。
**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 表达式,而应该向从中创建变量的类的构造函数提供参数(如果需要)。
Dim bottomLabel As New System.Windows.Forms.Label
如果使用同一个 As 子句声明多个变量,则不能为该组变量提供一个 initializer。
数组规则
**数组变量。**若要指定 variablelist 中的变量是数组,请在该变量的 variablename 后面紧跟一对括号。如果数组有多个维,则必须在括号之间包含逗号,以表示维数。
Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte
数组可以有 1 至 32 个维。
有关更多信息,请参见数组 (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。
**空白数组界限。**您可以在数组声明中将所有界限保留为空白。如果这样做,数组将具有您指定的维数,但不会被初始化。因此,在您初始化该数组的至少一部分元素之前,它的值保持为 Nothing。Dim 语句必须指定所有维的界限,或者不指定任何维的界限。
Dim messages() As String
**空数组。**可以使用 -1 来声明数组维数的上限。这表示数组为空但不是 Nothing,某些公共语言运行库函数需要进行这种区分。然而,Visual Basic 代码无法访问这种数组。如果您尝试这样做,则在执行过程中将发生 IndexOutOfRangeException 错误。有关更多信息,请参见如何:创建不含任何元素的数组。
**数组初始化。**可以通过使用大括号 ({}) 括起初始化值来初始化数组的值。
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
0001 年 1 月 1 日 凌晨 12:00 (01/01/0001 12:00:00 AM)
初始化结构的每个元素,如同它是单独的变量一样。如果声明数组的长度但不初始化它的元素,则将初始化每个元素,如同它是单独的变量一样。
**访问级别。**类和模块成员变量(位于所有过程之外)默认为私有访问,而结构成员变量默认为公共访问。可以使用访问修饰符来调整它们的访问级别。不能对局部变量(在过程内部)使用访问修饰符。
**范围。**局部变量仅在它们的过程或块的范围之内。成员变量在它们的整个类、结构或模块的范围内。
**限定。**类、结构或模块之外的代码必须使用该类、结构或模块的名称来限定某个成员变量的名称。过程或块之外的代码不能引用该过程或块之内的任何局部变量。
**生存期。**Static 局部变量的生存期比在其中声明它的过程的生存期更长。变量的生存期边界取决于声明该过程的位置以及该过程是否为 Shared。
过程声明
初始化变量的时间
变量不再存在
在模块中
第一次调用过程时
程序停止执行时
在类或结构中,为 Shared
对特定的实例或者对类或结构本身第一次调用过程时
程序停止执行时
在类或结构中,为非 Shared
对特定的实例第一次调用过程时
当释放实例以进行垃圾回收 (GC) 时
疑难解答
**执行顺序。**Dim 语句本身不是一条可执行语句。但是,如果它初始化一个或多个变量,则初始化将被视为赋值语句。这意味着变量值经历下列步骤:
首次进入声明变量的代码元素时,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}