Dim 语句 (Visual Basic)

声明和分配一个或多个变量的存储空间。

语法

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

组成部分

  • attributelist

    可选。 请参阅 特性列表

  • accessmodifier

    可选。 可以是以下值之一:

    请参阅Visual Basic 中的访问级别

  • Shared

    可选。 请参阅 共享

  • Shadows

    可选。 请参阅 阴影

  • Static

    可选。 请参阅 静态

  • ReadOnly

    可选。 请参阅 ReadOnly

  • WithEvents

    可选。 指定这些对象变量引用可以引发事件的类的实例。 请参阅 WithEvents

  • variablelist

    必需。 在此语句中声明的变量的列表。

    variable [ , variable ... ]

    每个 variable 都具有以下语法和部件:

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

    组成部分 说明
    variablename 必需。 变量的名称。 请参阅 Declared Element Names
    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

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

在模块级别,在任何过程外部声明的变量是 成员变量字段。 成员变量在其类、结构或模块中的作用域内。 在过程级别声明的变量是 局部变量。 局部变量仅在其过程或块范围内。

以下访问修饰符用于在过程外声明变量: PublicProtectedFriendProtected FriendPrivate 。 有关详细信息,请参阅Visual Basic 中的访问级别

Dim关键字是可选的,如果指定以下任意修饰符,通常省略此关键字: PublicProtectedFriendProtected Friend 、、、、、 Private Shared Shadows Static ReadOnlyWithEvents

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 ,则 类型推理 用于从初始值设定项推断数据类型。 在下面的示例中, num1num2 均强类型化为整数。 在第二个声明中,类型推理从值3推断类型。

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

类型推理适用于过程级别。 它不会应用于类、结构、模块或接口中的过程外部。 有关类型推理的详细信息,请参阅 选项推断语句局部类型推理

有关未指定数据类型或初始值设定项时所发生情况的信息,请参阅本主题后面的 默认数据类型和值

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

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

有关对象初始值设定项的详细信息,请参阅 如何:使用对象初始值设定项声明对象对象初始值设定项:命名类型和匿名类型和 匿名类型

声明多个变量

可以在一个声明语句中声明多个变量,并为每个变量指定变量名称,并在每个数组名称后面加上括号。 以逗号分隔多个变量。

Dim lastTime, nextTime, allTimes() As Date

如果使用一个子句声明多个变量 As ,则不能为该变量组提供初始值设定项。

您可以为不同的变量指定不同的数据类型,方法是 As 为每个声明的变量使用单独的子句。 每个变量都采用在 As 其部分后遇到的第一个子句中指定的数据类型 variablename

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 指定上限和下限(可选)。 无论是否指定,下限始终为零。 每个索引的大小均为0到其上限值。

下面两个语句是等效的。 每个语句声明21个元素的数组 Integer 。 访问数组时,索引的取值可能为0到20。

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

下面的语句声明一个类型为的二维数组 Double 。 数组有4行 (3 列,每) 6 列 (5 + 1) 每个列。 请注意,上限表示索引的可能的最大值,而不是维度的长度。 维度的长度为上限加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 。 某些公共语言运行时函数需要零长度数组。 如果尝试访问此类数组,则会发生运行时异常。 有关详细信息,请参阅 array

可以通过使用数组文本初始化数组的值。 为此,请将初始化值括在大括号中, ({}) 。

Dim longArray() As Long = {0, 1, 2, 3}

对于多维数组,每个单独维度的初始化都括在外部维度中的大括号内。 元素按行主顺序指定。

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

有关数组文本的详细信息,请参阅 数组

默认数据类型和值

下表描述了指定 Dim 语句中数据类型和初始值设定项的各种组合的结果。

是否指定数据类型? 是否指定初始值设定项? 示例 结果
Dim qty 如果 选项 Strict 在默认) (关闭,则将变量设置为 Nothing

如果 Option Strict 处于打开状态,则发生编译时错误。
Dim qty = 5 如果 选项推断 (默认) 上,则该变量将采用初始值设定项的数据类型。 请参阅 局部类型推理

如果 Option InferOption Strict 均处于关闭状态,则变量采用 Object 的数据类型。

如果 Option Infer 处于关闭状态但 Option Strict 处于打开状态,则发生编译时错误。
Dim qty As Integer 将变量初始化为数据类型的默认值。 请参阅本部分后面的表。
Dim qty As Integer = 5 如果初始值设定项的数据类型不可转换为指定数据类型,则会发生编译时错误。

如果指定数据类型但未指定初始值设定项,Visual Basic 会将变量初始化为其数据类型的默认值。 下表显示了默认的初始化值。

数据类型 默认值
所有数值类型 (包括 ByteSByte) 0
Char 二进制0
所有引用类型 (包括 ObjectString 和所有数组) Nothing
Boolean False
Date 12:00 年1月1日上午 (01/01/0001 12:00:00 AM)

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

静态局部变量生存期

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

过程声明 变量已初始化 变量停止了现有
在模块中 第一次调用该过程时 当程序停止执行时
在类或结构中,过程是 Shared 第一次在特定实例或类或结构自身上调用该过程时 当程序停止执行时
在类或结构中,过程不是 Shared 第一次在特定实例上调用该过程时 在释放实例以进行垃圾回收 (GC)

特性和修饰符

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

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

可以通过提供来指定哪些代码可以访问变量 accessmodifier 。 类和模块成员变量 (于任何过程之外) 默认为私有访问,而结构成员变量默认为公共访问。 您可以使用访问修饰符调整其访问级别。 不能在过程) (中使用对本地变量的访问修饰符。

只能 WithEvents 在成员变量上指定,而不能指定过程内的局部变量。 如果指定 WithEvents ,则变量的数据类型必须是特定的类类型,而不是 Object 。 不能使用声明数组 WithEvents 。 有关事件的详细信息,请参阅 事件

备注

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

释放托管资源

.NET Framework 垃圾回收器会释放托管资源,而不会对你的部分进行任何额外编码。 但是,您可以强制处置托管资源,而不是等待垃圾回收器。

如果某个类保存在特别宝贵的资源上 (例如数据库连接或) 的文件句柄),则可能不希望等到下一次垃圾回收,以清理不再使用的类实例。 类可以实现 IDisposable 接口,以提供一种在垃圾回收之前释放资源的方法。 实现该接口的类公开了一个 Dispose 方法,可以调用该方法来强制立即释放有价值的资源。

Using语句会自动执行获取资源的过程、执行一组语句,然后释放资源。 但是,资源必须实现 IDisposable 接口。 有关详细信息,请参阅 Using 语句

示例 1

下面的示例通过使用 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}

示例 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

另请参阅