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 语句本身不是一条可执行语句。但是,如果它初始化一个或多个变量,则初始化将被视为赋值语句。这意味着变量值经历下列步骤:

    1. 首次进入声明变量的代码元素时,Visual Basic 将其初始化为其数据类型的默认值。

    2. 执行到达变量的 Dim 语句时,Visual Basic 将其初始化为 Dim 语句中提供的值。

    3. 只要执行返回到变量的 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}

请参见

任务

如何:声明数组变量

如何:声明数组变量

如何:声明匿名类型的实例

如何:使用对象初始值设定项声明对象

概念

Visual Basic 中的变量声明

对象初始值设定项:命名类型和匿名类型

匿名类型

对象初始值设定项:命名类型和匿名类型

局部类型推理

参考

Const 语句 (Visual Basic)

ReDim 语句 (Visual Basic)

Option Explicit 语句 (Visual Basic)