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 可选。列出数组变量的每个维的界限。
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

可以在过程、块、类、结构或模块中声明变量。 不能在源文件、命名空间或接口中声明变量。 有关更多信息,请参见声明上下文和默认访问级别 (Visual Basic)

在任何过程之外,在模块级声明的变量是“成员变量”或“字段”。 成员变量在它们的整个类、结构或模块的范围内。 在过程级声明的变量是“局部变量”。 局部变量仅在它们的过程或块的范围之内。

下面的访问修饰符用于在过程之外声明变量: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 打开 (默认值),则编译器为您所使用的每个变量需要一个声明。 有关更多信息,请参见Option Explicit 语句 (Visual Basic)

指定初始值

还可以在创建变量时给其赋值。 对于值类型,可使用“初始值设定项”来提供要赋予变量的表达式。 表达式的计算结果必须为可以在编译时计算的常数。

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 语句局部类型推理 (Visual Basic).

有关未指定初始值设定项或数据类型时所出现情况的信息,请参见本主题下文中的默认数据类型和值

您可以使用“对象初始值设定项”声明命名和匿名类型的实例。 下面的代码创建 Student 类的实例,并使用对象初始值设定项来初始化属性。

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

有关对象初始值设定项的更多信息,请参见如何:使用对象初始值设定项声明对象 (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

数组

您可以声明一个存放数组的变量,而数组可以存放多个值。 若要指定存放数组的变量,请在其 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 来声明“零长度的数组”。 存储零长度数组的变量不具有 Nothing 值。 某些公共语言运行时函数需要零长度的数组。 如果您尝试访问此类数组,则会发生运行时异常。 有关更多信息,请参见数组 (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 关闭 (默认值),则变量设置为 Nothing。

如果 Option Strict 为 on,则会发生编译时错误。

Dim qty = 5

如果 Option Infer 打开 (默认值),则变量拍摄初始值设定项的数据类型。 请参见 局部类型推理 (Visual Basic)

如果 Option Infer 处于关闭状态,并且 Option Strict 处于关闭状态,则该变量采用 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

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

初始化结构的每个元素,如同它是单独的变量一样。 如果声明数组的长度但不初始化它的元素,则将初始化每个元素,如同它是单独的变量一样。

静态局部变量生存期

Static 局部变量的生存期比在其中声明它的过程的生存期更长。 变量的生存期边界取决于声明该过程的位置以及该过程是否为 Shared。

过程声明

初始化变量的时间

变量停止存在

在模块中

第一次调用过程时

程序停止执行时

在选件类或结构,程序是 Shared

对特定的实例或者对类或结构本身第一次调用过程时

程序停止执行时

在选件类或结构,程序不是 Shared

对特定的实例第一次调用过程时

当释放实例以进行垃圾回收 (GC) 时

特性和修饰符

您可以将特性仅应用于成员变量,而不应用于局部变量。 特性向程序集的元数据提供信息,这对于临时存储(如局部变量)来说并没有意义。

在模块级别上,不能使用 Static 修饰符来声明成员变量。 在过程级别上,不能使用 Shared、Shadows、ReadOnly、WithEvents 或任何访问修饰符来声明局部变量。

您可以提供 accessmodifier 来指定什么代码可以访问变量。 类和模块成员变量(位于所有过程之外)默认为私有访问,而结构成员变量默认为公共访问。 可以使用访问修饰符来调整它们的访问级别。 不能对局部变量(在过程内部)使用访问修饰符。

只能在成员变量上指定 WithEvents,而不能在过程中的局部变量上指定。 如果指定 WithEvents,则变量的数据类型必须是特定的类类型,而不能是 Object。 不能使用 WithEvents 来声明数组。 有关事件的更多信息,请参见 事件 (Visual Basic)

备注

类、结构或模块之外的代码必须使用该类、结构或模块的名称来限定某个成员变量的名称。过程或块之外的代码不能引用该过程或块之内的任何局部变量。

释放托管资源

.NET Framework 垃圾回收器处理托管资源,而无需任何额外代码中的部分。 但是,可以强制托管资源的进程 (而不是等待垃圾回收器。

如果选件类保持一种尤为重要和缺少资源 (如数据库连接或文件句柄),您可能不希望等待下一次垃圾回收清理中不再使用的选件类实例。 选件类可以实现 IDisposable 接口提供了垃圾回收之前释放资源。 实现该接口公开 Dispose 方法可调用强制重要的资源将立即被释放的选件类。

Using 语句自动获取资源,执行一组语句,然后释放资源处理。 但是,该资源必须实现 IDisposable 接口。 有关更多信息,请参见Using 语句 (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

请参见

任务

如何:使用对象初始值设定项声明对象 (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)