Dim 语句 (Visual Basic)

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

语法

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

部件

  • attributelist

    可选。 请参阅特性列表

  • accessmodifier

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

    请参阅 Access levels in Visual Basic

  • Shared

    可选。 请参阅 Shared

  • Shadows

    可选。 请参阅 Shadows

  • Static

    可选。 请参阅 静态

  • ReadOnly

    可选。 请参阅 ReadOnly

  • WithEvents

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

  • variablelist

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

    variable [ , variable ... ]

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

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

    部件 DESCRIPTION
    variablename 必填。 变量的名称。 请参阅 声明的元素名称
    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

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

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

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

如果指定以下任何修饰符,则Dim关键字是可选的,通常省略该关键字:Public、、ProtectedFriendSharedStaticPrivateShadowsProtected Friend或。 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

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

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

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

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

有关对象初始值设定项的详细信息,请参阅 How to: Declare an Object InitializerObject Initializers: Named and Anonymous Types, and Anonymous Types.

声明多个变量

可以在一个声明语句中声明多个变量,为每个变量指定变量名称,并使用括号关注每个数组名称。 多个变量用逗号分隔。

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)。 请注意,上限表示索引的最高可能值,而不是维度的长度。 维度的长度是上限加 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 如果 Option Strict 处于关闭状态(默认值),则变量设置为 Nothing

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

如果Option Infer已关闭且Option 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 (01/01/0001 上午 12:00:00)

结构的每个元素都初始化,就像它是一个单独的变量一样。 如果声明数组的长度但不初始化其元素,则会初始化每个元素,就好像它是一个单独的变量一样。

静态局部变量生存期

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

另请参阅