共用方式為


Visual Basic 中的存留期

宣告專案的 存留期 是可供使用的時間週期。 變數是唯一具有存留期的元素。 為此,編譯程式會將程序參數和函式視為變數的特殊案例。 變數的存留期代表可以保存值的期間。 它的價值可以在它的生命周期中變化,但總會保有一定的價值。

不同的人生

成員變數(在模組層級宣告,在任何程式之外宣告)通常具有與宣告它所在的專案相同的存留期。 在類別或結構中宣告的非共用變數,會針對宣告類別或結構的每個實例,以個別復本的形式存在。 每個這類變數都有與其實例相同的存留期。 不過, Shared 變數只有單一存留期,持續整個應用程式執行的時間。

局部 變數 (在程式內宣告)只有在宣告它的程式正在執行時才會存在。 這也適用於該流程的參數以及任何函式的返回值。 不過,如果該程式會呼叫其他程式,則局部變數會在呼叫的程序執行時保留其值。

生命的開始

當控件進入宣告它的程式時,局部變數的存留期就會開始。 一旦程式開始執行,每個局部變數都會初始化為其數據類型的預設值。 當程式遇到 Dim 指定初始值的語句時,它會將這些變數設定為那些值,即使您的程式代碼已經將其他值指派給他們也一樣。

結構變數的每個成員都會初始化,就像它是個別的變數一樣。 同樣地,陣列變數的每個元素都會被單獨初始化。

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

壽命終結

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

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

延長使用壽命

如果您使用 關鍵詞宣告局部變數 Static ,其存留期會超過其程式的運行時間。 下表顯示程式宣告如何決定變數存在的時間 Static 長度。

程序位置和共享 靜態變數存留期開始 靜態變數存留期結束
在模組中(預設為共享) 第一次呼叫程式時 應用程式停止執行時
在類別中, Shared (程式不是實體成員) 當在特定實例或類別或結構名稱本身上第一次調用程序時 應用程式停止執行時
在類別的實例中,不是 Shared (程式是實例成員) 第一次在特定實例上呼叫程式 當實例被釋放以便進行垃圾收集時 (GC)

相同名稱的靜態變數

您可以在多個程式中宣告具有相同名稱的靜態變數。 如果您這樣做,Visual Basic 編譯程式會將每個這類變數視為個別的 元素。 其中一個變數的初始化不會影響其他變數的值。 如果您定義一組多載的程式,並在每個多載中宣告具有相同名稱的靜態變數,則同樣適用。

包含靜態變數的元素

您可以在類別內宣告靜態局部變數,也就是在該類別中的程式內。 不過,您無法將 結構內的靜態局部變數宣告為結構成員,或宣告為該結構內程式的局部變數。

範例

說明

下列範例會宣告具有 Static 關鍵詞的變數。 (請注意,Dim使用 修飾詞時,您不需要 關鍵詞,例如 Static

程式碼

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

評論

在上述範例中,此變數 applesSold 會在程式 runningTotal 傳回呼叫程式代碼之後繼續存在。 下次呼叫 時 runningTotalapplesSold 會保留其先前計算的值。

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

編譯程式碼

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

安全

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

另請參閱