声明数组变量

数组变量的声明与其他变量的声明一样,使用 Dim
语句。在变量名后加上一对或几对圆括号,即可表示它是数组而不是“标量”(包含单个值的变量)。

声明单维数组变量

  • 在声明中,在变量名后添加一对圆括号,如下例所示:
    Dim MySingleArray() As Integer   
  • 或者是 Dim MySingleArray(n) As Integer  :里面的n不是数组大小,而是数组索引最大值,如定义3个数组,则n=2,如 MySingleArray(0), MySingleArray(1), MySingleArray(2)

声明多维数组变量

  • 在声明中,在变量名后添加一对圆括号并将逗号置于圆括号中以分隔维数,如下例所示:
    Dim My4DArray(,,,) As Short   ' Four-dimensional array.

声明交错数组变量

  • 在声明中,在变量名后添加的圆括号对数与嵌套数组的级数相同,如下例所示:
    Dim MyJaggedArray()()() As Byte   ' Array of arrays of Byte arrays. 

初始化数组

可以将一个数组变量初始化为声明的一部分。在声明语句中可以进行下列操作之一:

  • 在变量名后跟的圆括号中指定一个或几个维度的初始长度,不必为变量分配数组对象。
  • 使用 New 子句为变量分配数组对象。使用 New 子句时,其后必须跟有花括号
    ({}),即使花括号内没有任何内容也是如此。
  • 为变量分配一个数组对象,并在 New 子句中提供初始长度。
  • 为变量分配数组对象并在 New 子句中提供初始元素值。可以在同一 New 子句中同时提供长度与值。

如果在变量名后跟随的圆括号中指定了维度长度,必须在它后面使用一个赋值语句,以将一个数组对象分配给变量。下面的示例声明说明了一个单维数组变量的有效和无效语法:

Dim BA(2) As Byte   ' Currently contains Nothing (no object). 
Dim BA(2) As Byte = New Byte()   ' INVALID (New after length specified).
Dim BA() As Byte = New Byte() {}   ' Empty Byte array object. 
Dim BA() As Byte = New Byte()   ' INVALID (missing braces). 
Dim BA() As Byte = New Byte(2)   ' INVALID (missing braces). 
Dim BA() As Byte = New Byte() {0,1,2}   ' (0) through (2). 
Dim BA() As Byte = New Byte(2) {0,1,2}   ' (0) through (2). 

以类似方法可以初始化多维数组变量。下面的示例声明将一个两维数组变量声明为 2 行 2 列的 Short 型数组。

Dim S2X2(1, 1) As Short   ' (0) through (1), (0) through (1). 
Dim S2X2(1, 1) As Short = New Short(,)   ' INVALID (New after lengths). 
Dim S2X2(,) As Short = New Short(,)   ' INVALID (missing braces). 
Dim S2X2(,) As Short = New Short(1, 1)   ' INVALID (missing braces). 
Dim S2X2(,) As Short = New Short(,) {}   ' Empty array object. 
Dim S2X2(,) As Short = New Short(1, 1) {}   ' Elements have default value. 
Dim S2X2(,) As Short = New Short(,) {{5, 6}, {7, 8}}   ' Four elements. 

第一个参数表示行;第二个参数表示列。在前面声明的数组中,行与列的索引值都是从 0 变化到 1。

当初始化一个交错数组变量时,只能指定顶级数组的维度长度。下面的示例声明说明了一个 Byte 元素数组中的一个数组的有效和无效语法:

Dim JB(1)() As Byte   ' Array of two arrays of Byte elements. 
Dim JB(1)(1) As Byte   ' INVALID (can only specify top-level size). 
Dim JB(1)() As Byte = New Byte()()   ' INVALID (New after lengths). 
Dim JB()() As Byte = {New Byte() {}, New Byte() {}}   ' Empty arrays. 
Dim JB()() As Byte = {New Byte(1) {}, New Byte(1) {}}   ' Default values. 
Dim JB()() As Byte = {New Byte() {5, 6}, New Byte() {7, 8}} 

在上述最后一个声明中,JB 初始化为两个元素,即:JB(0)
JB(1),它们中的每一个又被初始化为两个元素的 Byte 数组,第一个的元素值为 5 和
6,第二个的元素值为 7 和 8。

数组大小的限制

数组每一维的长度受 Long 数据类型最大值 ((2 ^ 64) – 1)
的限制。数组的总大小受到操作系统和可用内存数量的制约。如果使用数组的大小超出了系统中可用 RAM 的数量,速度将变慢,因为数据必须在磁盘上进行交换。

注意   由于数组在 Visual
Basic .NET
中是对象,因此,区分数组对象和数组变量非常重要。数组对象创建之后就不再改变其大小和级别。然而,数组变量在其生存期内可以被分配多个不同的数组,且所分配数组可以是不同的大小和秩。

调整数组大小

通过使用 ReDim
或标准的赋值语句给数组变量赋以不同的数组对象,可以随时改变它的大小。虽然新数组对象必须保持相同的秩,但其维数可以不同。这样有助于您高效管理内存。例如,就可以在短时间内使用一个大型数组,然后通过
ReDim 使其变小。如此可以释放不再需要的内存。

当使用 ReDim 语句改变数组大小时,数组原有的值通常会丢失。但您可以在 ReDim 语句中使用 Preserve
关键字来保持这些值。例如,下面的语句分配一个新的数组,其元素由现有 MyArray
的相应元素初始化,然后将新数组分配给 MyArray

ReDim Preserve MyArray(10, 20) 

在多维数组中,当您使用 Preserve
时只能更改数组的最后一维。如果要更改其他维,将会出现运行时错误。如果不知道某一维的当前大小,可以使用 GetUpperBound
方法,该方法返回指定维度的最大下标值。

在下面的示例中,第一行是有效的,而第二行无效,因为它试图更改二维中的第一维。

ReDim Preserve Matrix(Matrix.GetUpperBound(0), Matrix.GetUpperBound(1) + 10) 
ReDim Preserve Matrix(Matrix.GetUpperBound(0) + 10, Matrix.GetUpperBound(1))