如果使用了Preserve 关键字,就只能重定义数组最末维的大小,且不能改变维数的数目。例如,如果数组就是一维的,则可以重定义该维的大小,因为它是最末维,也是仅有的一维。不过,如果数组是二维或更多维时,则只有改变其最末维才能同时仍保留数组中的内容。下面的示例介绍了如何在为已有的动态数组增加其最末维大小的同时而不清除其中所含的任何数据。
再给你具个例子:
dim a(1 to 3) as integer
a(1)=1
a(2)=2
redim Preserve (a 1 to 5) as integer
'a(1)和a(2)的值保留,仍为1、2
如果
redim (a 1 to 5) as integer
'a(1)和a(2)的值不保留,还原为默认值。
如果要知道更官方的说明,请看下面:(摘自MSDN>>>)
为数组变量重新分配存储空间。
|
ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, ... ] ] |
可以使用 ReDim 语句来更改某个已声明数组的一个或多个维度的大小。如果有一个较大的数组,并且您不再需要它的某些元素,ReDim 可通过减小数组大小来释放内存。另一方面,如果代码确定某个数组需要更多元素,ReDim 也可以添加它们。
ReDim 语句仅适用于数组。它在标量(只包含单一值的变量)、集合或结构上是无效的。请注意,如果将变量声明为采用 Array 类型,ReDim 语句将没有足够的类型信息来创建新数组。
仅可以在过程级使用 ReDim。这意味着,变量的“声明上下文”必须是过程,而不能是源文件、命名空间、接口、类、结构、模块或块。有关更多信息,请参见声明上下文和默认访问级别。
规则
-
修饰符。只能指定 Preserve 修饰符,并且,如果这样做,就不能省略 ReDim 关键字。
-
多个变量。可以在同一声明语句中调整多个数组变量的大小,同时为每个变量指定 name 和 boundlist 部分。以逗号分隔多个变量。
-
数组界限。 boundlist 中的各个条目可指定该维度的下限和上限。不管是否指定,下限总是为零。上限是该上标的最大可能值,而不是维度的长度(即上限加 1)。每个上标都可能在零到其上限值之间变动。
boundlist 中维度的数量必须与数组的原始秩匹配。
-
空数组。可以使用 -1 来声明数组维度的上限。这表示数组为空,但不是 Nothing (Visual Basic)。有关更多信息,请参见如何:创建不含任何元素的数组。然而,Visual Basic 代码不能成功访问此类数组。如果试图这样做,则在执行期间会发生 IndexOutOfRangeException 错误。
-
数据类型。 ReDim 语句无法更改数组变量或其元素的数据类型。
-
初始化。 ReDim 语句无法为数组元素提供新的初始化值。
-
秩。 ReDim 语句无法更改数组的秩(维数)。
-
使用 Preserve 调整大小。如果使用 Preserve,则只能调整数组最后一个维度的大小,对于其他每个维度,您必须指定它在现有数组中已经具有的相同界限。
例如,如果数组只有一维,而可以调整该维度的大小并依然保留数组的所有内容,因为您更改的是最后一个并且唯一的维度。然而,如果数组具有两个或多个维度,则如果使用 Preserve 将仅可以更改最后维度的大小。
-
属性。可以在容纳值数组的属性上使用 ReDim。
行为
-
数组替换。 ReDim 释放现有数组并且创建具有相同秩的新数组。新数组将替换数组变量中已释放的数组。
-
不使用 Preserve 初始化。如果未指定 Preserve,ReDim 会将新数组的元素初始化为它们数据类型的默认值。
-
使用 Preserve 初始化。如果指定 Preserve 修饰符,Visual Basic 会将这些元素从现有数组复制到新数组。
下面的示例将增加某个动态数组最后一个维度的大小(不会丢失数组中的任何现有数据),然后减小该大小(会有部分数据丢失)。最后,它会将大小重新减小到其原始值,并重新初始化所有数组元素。
Visual Basic |
Dim intArray(10, 10, 10) As IntegerReDim Preserve intArray(10, 10, 20)ReDim Preserve intArray(10, 10, 15)ReDim intArray(10, 10, 10) |
第一个 ReDim 将创建一个新数组,该数组将替换变量 intArray 中的现有数组。ReDim 会将所有元素从现有数组复制到新数组。它还会在每一层中每个行的结尾另外添加 10 列,并将这些新列中的元素初始化为 0(数组元素类型 Integer 的默认值)。
第二个 ReDim 创建另一个新数组,复制所有适合的元素。然而,每一层的每一行的结尾丢失了 5 列。如果不再使用这些栏,丢失将不成问题。减小大型数组的大小能够释放不再需要的内存。
第三个 ReDim 仍然创建另一个新数组,同时从每一层中每个行的结尾移除另外 5 列。这一次它不会复制任何现有元素。这样即会将数组恢复为其原始大小,并将它的所有元素还原为它们的原始默认值。