Dim 语句 (Visual Basic)
声明一个或多个变量并为其分配存储空间。
语法
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist
组成部分
attributelist
可选。 请参阅特性列表。
accessmodifier
可选。 可以是以下值之一:
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
可以在过程、块、类、结构或模块中声明变量。 不能在源文件、命名空间或接口中声明变量。 有关详细信息,请参阅声明上下文和默认访问级别。
在任何过程外部的模块级别声明的变量是成员变量或字段。 成员变量的作用域是其整个类、结构或模块。 在过程级别声明的变量是局部变量。 局部变量的作用域仅在其过程或块内。
以下访问修饰符用于在过程外声明变量: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
为 on(默认值),则编译器要求声明所使用的每个变量。 有关详细信息,请参阅 Option Explicit 语句。
指定初始值
可以在创建变量时向它分配值。 对于值类型,可使用初始值设定项提供要分配给变量的表达式。 表达式的计算结果必须是可在编译时进行计算的常量。
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 语句和本地类型推断。
有关未指定数据类型或初始值设定项时所发生情况的信息,请参阅本主题后面部分的默认数据类型和值。
可以使用对象初始值设定项声明命名类型和匿名类型的实例。 下面的代码创建 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 个维度。
可以在数组声明中将所有上下限留空。 如果这样做,则数组具有指定的维度数,但它未初始化。 在初始化至少部分元素之前,其值为 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 为 off(默认值),则变量设置为 Nothing 。如果 Option Strict 处于打开状态,则发生编译时错误。 |
否 | 是 | Dim qty = 5 |
如果 Option Infer 为 on(默认值),则变量采用初始值设定项的数据类型。 请参阅本地类型推断。 如果 Option Infer 和 Option Strict 均处于关闭状态,则变量采用 Object 的数据类型。如果 Option Infer 处于关闭状态但 Option Strict 处于打开状态,则发生编译时错误。 |
是 | 否 | Dim qty As Integer |
将变量初始化为数据类型的默认值。 请参阅本部分后面的表。 |
是 | 是 | Dim qty As Integer = 5 |
如果初始值设定项的数据类型不可转换为指定数据类型,则会发生编译时错误。 |
如果指定了数据类型但未指定初始值设定项,则 Visual Basic 会将变量初始化为其数据类型的默认值。 下表显示默认初始化值。
数据类型 | 默认值 |
---|---|
所有数值类型(包括 Byte 和 SByte ) |
0 |
Char |
二进制 0 |
所有引用类型(包括 Object 、String 和所有数组) |
Nothing |
Boolean |
False |
Date |
1 年 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
声明数组。 有关事件的详细信息,请参阅事件。
注意
类、结构或模块之外的代码必须使用该类、结构或模块的名称来限定成员变量的名称。 过程或块之外的代码不能引用该过程或块内的任何局部变量。
释放受管理资源
.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