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)
参考
Option Explicit 语句 (Visual Basic)
概念
对象初始值设定项:命名类型和匿名类型 (Visual Basic)
对象初始值设定项:命名类型和匿名类型 (Visual Basic)