除范圍之外,變量還有存活期,在這一期間變量能夠保持它們的值。在應(yīng)用程序的存活期內(nèi)一直保持模塊級(jí)變量和公用變量的值。但是,對(duì)于 dim 聲明的局部變量以及聲明局部變量的過(guò)程,僅當(dāng)過(guò)程在執(zhí)行時(shí)這些局部變量才存在。通常,當(dāng)一個(gè)過(guò)程執(zhí)行完畢,它的局部變量的值就已經(jīng)不存在,而且變量所占據(jù)的內(nèi)存也被釋放。當(dāng)下一次執(zhí)行該過(guò)程時(shí),它的所有局部變量將重新初始化。
但可將局部變量定義成靜態(tài)的,從而保留變量的值。在過(guò)程內(nèi)部用 static 關(guān)鍵字聲明一個(gè)或多個(gè)變量,其用法和 dim 語(yǔ)句完全一樣:
static depth
例如,下面的函數(shù)將存儲(chǔ)在靜態(tài)變量 accumulate 中的以前的運(yùn)營(yíng)總值與一個(gè)新值相加,以計(jì)算運(yùn)營(yíng)總值。
function runningtotal (num)
static applessold
applessold = applessold + num
runningtotal = applessold
end function
如果用 dim 而不用 static 聲明 applessold,則以前的累計(jì)值不會(huì)通過(guò)調(diào)用函數(shù)保留下來(lái),函數(shù)只會(huì)簡(jiǎn)單地返回調(diào)用它的那個(gè)相同值。
在模塊的聲明段聲明 applessold,并使它成為模塊級(jí)變量,由此也會(huì)收到同樣效果。但是,這種方法一旦改變變量的范圍,過(guò)程就不再對(duì)變量排他性存取。由于其它過(guò)程也可以訪問(wèn)和改變變量的值,所以運(yùn)營(yíng)總值也許不可靠,代碼將更難于維護(hù)。
聲明所有的局部變量為靜態(tài)變量
為了使過(guò)程中所有的局部變量為靜態(tài)變量,可在過(guò)程頭的起始處加上 static 關(guān)鍵字。例如:
static function runningtotal (num)
這就使過(guò)程中的所有局部變量都變?yōu)殪o態(tài),無(wú)論它們是用 static、dim 或 private 聲明的還是隱式聲明的。可以將 static 放在任何 sub 或 funtion 過(guò)程頭的前面,包括事件過(guò)程和聲明為 private 的過(guò)程。