Dim 语句 (Visual Basic)

声明一个或多个变量并为其分配存储空间。

语法

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

组成部分

  • attributelist

    可选。 请参阅特性列表

  • accessmodifier

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

    请参阅 Access levels in 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 必需。 变量的名称。 请参阅 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 FriendPrivateSharedShadowsStaticReadOnlyWithEvents

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

如果 Option Explicit 为 on(默认值),则编译器要求声明所使用的每个变量。 有关详细信息,请参阅 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

类型推理在过程级别进行应用。 它不在类、结构、模块或接口中的过程之外进行应用。 有关类型推理的详细信息,请参阅 Option Infer 语句本地类型推断

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

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

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

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

声明多个变量

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

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 后面加上括号。 有关数组的详细信息,请参阅数组

可以指定数组各个维度的下限和上限。 为此,请在括号内包含 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 个维度。

可以在数组声明中将所有上下限留空。 如果这样做,则数组具有指定的维度数,但它未初始化。 在初始化至少部分元素之前,其值为 NothingDim 语句必须为所有维度或不为任何维度指定上下限。

' 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 如果 Option Strict 为 off(默认值),则变量设置为 Nothing

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

如果 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 1 年 1 月 1 日凌晨 12:00 (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

另请参阅