對象的作用域決定哪些腳本可以使用該對象。默認情況下,當您創建對象實例時,該對象具有頁作用域。同一 asp 頁中的任何腳本命令都能使用該頁作用域的對象;當 ASP 頁送回客戶端時,該對象即被釋放。對大多數對象來說,推薦的作用域是頁作用域。您可以改變一個對象的作用域,使其可被其他頁的腳本使用。本主題將解釋如何使用頁作用域的對象以及如何改變對象的作用域。
使用頁作用域對象 在 ASP 頁上用 Server.CreateObject 創建的對象在該頁的生存期內一直存在。該對象對該頁的任何腳本命令都是可訪問的,當 ASP 處理完該頁時,該對象即被釋放。因此,對象具有該頁的作用域或生命周期。
在用 Visual Basic 或 VBScript 編程時,要注意在 ASP 處理完該頁之前不要釋放對象。例如,以下語句經常用于通過將對象變量賦以 Nothing 值來釋放對象:
Set myObj = Nothing 如果您在 ASP 頁中包含了該語句,那么任何使用 myObj 的企圖都將會返回一個預期的錯誤代碼。但在內部,即使在對象釋放以后,ASP 仍保留對它的引用。當您在腳本中不能使用對象時,對象的資源直到 ASP 處理完頁之后才釋放。同樣,如果您通過創建另一個對象實例并將其賦給已使用過的對象變量來釋放該對象時,ASP 將保留對原對象實例的引用。對大多數腳本來說,創建多個對象可能不會產生問題,但如果對象使用共享資源,比如數據庫連接,就有可能出現問題。
<% For I = 0 to 1000 Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "connection string" Next %> 總的來說,應該盡量避免在一個循環內部創建對象。如果無法避免,您應該手工釋放被對象使用過的資源。如果 Connection 對象僅被創建一次,且數據資源的物理連接在每個循環中被打開然后關閉,那么上例將會正常運行:
<% Set Conn = Server.CreateObject("ADODB.Connection") For I = 0 to 1000 Conn.Open "connection string" Conn.Close Next %> 為對象賦予會話作用域 在應用程序中,對于每個新會話,都會創建 session-scope 對象,并且在會話結束后會將其釋放。因此,每個活動的會話都有一個對象。會話作用域用于從多個腳本中調用的對象,但只影響一個用戶會話。您可以只在需要時才為對象賦予會話作用域。如果確實需要使用會話作用域,那么就必須了解提供對象的組件的線程模型,因為它影響性能和對象的安全環境。詳細信息,請參閱本主題的“高級信息:性能問題” 。
要為對象賦予會話作用域,請將對象存儲在 ASP Session 內建對象中,您既可以在 Global.asa 文件中使用 <OBJECT> 標記,也可以在 ASP 頁上使用 Server.CreateObject 方法創建具有會話作用域的對象實例。