天天看點

VB中preserve的用法

注:本文轉載自:http://zhidao.baidu.com/question/161401549.html

ReDim 語句用來定義或重定義原來已經用帶空圓括号(沒有維數下标)的 Private、Public 或 Dim 語句聲明過的動态數組的大小。

可以使用 ReDim 語句反複地改變數組的元素以及維數的數目,但是不能在将一個數組定義為某種資料類型之後,再使用 ReDim 将該數組改為其它資料類型,除非是 Variant 所包含的數組。如果該數組确實是包含在某個 Variant 中,且沒有使用 Preserve 關鍵字,則可以使用 As type 子句來改變其元素的類型,但在使用了此關鍵字的情況下,是不允許改變任何資料類型的。

如果使用了 Preserve 關鍵字,就隻能重定義數組最末維的大小,且根本不能改變維數的數目。例如,如果數組就是一維的,則可以重定義該維的大小,因為它是最末維,也是僅有的一維。不過,如果數組是二維或更多元時,則隻有改變其最末維才能同時仍保留數組中的内容。下面的示例介紹了如何在為已有的動态數組增加其最末維大小的同時而不清除其中所含的任何資料。

ReDim X(10, 10, 10)

. . .

ReDim Preserve X(10, 10, 15)

同樣地,在使用 Preserve 時,隻能通過改變上界來改變數組的大小;改變下界則會導緻錯誤。

如果将數組改小,則被删除的元素中的資料就會丢失。如果按位址将數組傳遞給某個過程,那麼不要在該過程内重定義該數組的各維的大小。

在初始化變量時,數值變量被初始化為 0,變長的字元串被初始化為一個零長度的字元串 (""),而定長的字元串則用 0 填充。Variant 變量被初始化為 Empty。使用者自定義類型的變量的每個元素作為各自獨立的變量進行初始化。在使用引用對象的變量之前,必須使用 Set 語句将一個已有的對象賦給該變量。在被指派之前,所聲明的對象變量有一個特定值 Nothing,這個值表示該變量沒有指向任何對象的執行個體。

小心 如果 ReDim 語句所使用的變量在子產品級别或過程級别不存在,則該語句就相當于一個聲明語句。如果此後在一個更廣的範圍内又建立了同名的變量,即使使用了 Option Explicit,ReDim 也将使用後聲明的這個變量,且不會導緻編譯錯誤。為了避免這種沖突,就不應把 ReDim 作為聲明語句使用,而隻應作為重定義數組大小的語句。

注意 要改變 Variant 所包含的數組的大小,必須在試圖改變其數組大小之前顯式聲明該 Variant 變量。

保留動态數組的内容

每次執行 ReDim 語句時,目前存儲在數組中的值都會全部丢失。Visual Basi 重新将數組元素的值置為 Empty(對 Variant 數組)、置為 0(對 Numeric 數組)、置為 零長度字元串(對 String 數組)或者置為 Nothing(對于對象的數組)。

在為新資料準備數組,或者要縮減數組大小以節省記憶體時,這樣做是非常有用的。有時希望改變數組大小又不丢失數組中的資料。使用具有 Preserve 關鍵字的 ReDim 語句就可做到這點。例如,使用 UBound 函數引用上界,使數組擴大、增加一個元素,而現有元素的值并未丢失:

ReDim Preserve DynArray (UBound (DynArray) + 1)

在用 Preserve 關鍵字時,隻能改變多元數組中最後一維的上界;如果改變了其它維或最後一維的下界,那麼運作時就會出錯。是以可這樣程式設計:

ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)

而不可這樣程式設計:

ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)