Visual Basic 中的存留期

已宣告元素的「存留期」是指該元素可供使用的時間長度。 變數是唯一有存留期的元素。 為此,編譯器會將程序參數和函式傳回內容視為特殊變數案例來處理。 變數的存留期代表變數可以保留值的期間。 該值在存留期內可以變更,但變數一律會保留值。

不同的存留期

「成員變數」(在任何程序之外的模組層級宣告) 通常與宣告它的元素有相同的存留期。 在類別或結構宣告的非共用變數,會在宣告它的類別或結構的每個執行個體中,另以複本的形式存在。 每個這類變數的存留期都與其執行個體相同。 不過,Shared 變數只有單一存留期,會在整個應用程式執行期間存留。

「區域變數」(在程序之內宣告) 只會在宣告它的程式正在執行期間才會存在。 此特性也適用於該程序的參數和任何函式的傳回項目。 不過,如果該程序會呼叫其他程序,則區域變數會在呼叫的程序執行期間保留其值。

存留期開始

程序宣告控制項後,只要該控制項一進入程序,區域變數的存留期就會開始。 程序一開始執行,每個區域變數都會初始化為所屬資料型別的預設值。 如果程序遇到 Dim 指定初始值的陳述式,就會將變數設為這些值,即使您已用程式碼對這些變數指派其他值,結果也不變。

結構變數的每個成員都如同各為不同變數一樣,經過初始化。 同樣地,陣列變數的每個元素也都會個別初始化。

在程序 (例如 For 迴圈) 當中的區塊內,宣告的變數會在進入程序時初始化。 不論您的程式碼是否執行區塊,這種初始化都會生效。

存留期結束

程序終止時不會保留區域變數的值,而 Visual Basic 也會回收記憶體。 下次呼叫程序時,所有區域變數都會重新建立並重新初始化。

當類別或結構的執行個體終止時,非共用變數會失去其記憶體和值。 類別或結構的每個新執行個體都會建立並重新初始化其非共用變數。 不過,Shared 變數會一直保留到應用程式停止執行為止。

延長存留期

如果以 Static 關鍵字宣告區域變數 ,其存留期會比程序的執行期間更長。 下表所示為程序宣告會如何決定 Static 變數存在的時間長度。

程序位置和共用 靜態變數存留期開始 靜態變數存留期結束
在模組中 (預設為共用) 初次呼叫程序時 應用程式停止執行時
在類別中,設為 Shared (程序不是執行個體成員) 初次對特定執行個體或對類別或結構名稱本身呼叫程序 應用程式停止執行時
在類別的執行個體中,非 Shared (程序是執行個體成員) 初次對特定執行個體呼叫程序 釋出執行個體以進行記憶體回收時 (GC)

相同名稱的靜態變數

您可以在多個程序中宣告相同名稱的靜態變數。 這麼做的時候,Visual Basic 編譯器會將每個這類變數都視為個別元素。 其中任一變數的初始化,並不會影響其他變數的值。 如果您定義的程序包含一組多載,且您在每個多載中都宣告相同名稱的靜態變數,則也是同樣情形。

在靜態變數中加入元素

您可以在類別中宣告靜態區域變數,亦即在該類別的程序之內宣告。 不過,您無法將結構內的靜態區域變數宣告為結構成員,或該結構內的程序所屬區域變數。

範例

描述

以下範例宣告的變數包含 Static 關鍵字。 (請注意,當 Dim 陳述式使用 Static 這類修飾元時,您並不需要 Dim 關鍵字。)

程式碼

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

註解

在上述範例中,變數 applesSold 在程序 runningTotal 向呼叫程式碼傳回內容後,會繼續存在。 下次呼叫 runningTotal 時 ,applesSold 會保留之前計算的值。

如果宣告 applesSold 時不使用 Static,則之前累積的值不會在呼叫 runningTotal 後保留。 下次呼叫 runningTotal 時,applesSold 會重新建立並初始化為 0,而 runningTotal 只會回應呼叫而傳回相同的值。

編譯程式碼

您可以將靜態區域變數的值初始化為宣告的一部分。 如果您將陣列宣告為 Static,您可以初始化它的順位 (維度數目)、每個維度的長度,以及個別元素的值。

安全性

在上述範例中,您可以在模組層級宣告 applesSold,藉此產生相同的存留期。 不過,如果您以這種方式變更變數的範圍,程序將不再有變數的獨佔存取權。 因為其他程序可以存取 applesSold 並變更它的值,執行總數可能不可靠,且程式碼也可能更難以維護。

另請參閱