在ASP(Active Server Pages)中,Set 关键字是处理对象引用的核心工具,它用于创建对象实例、赋值对象引用,并管理COM组件的生命周期,正确使用 Set 是避免运行时错误和内存泄漏的关键。

Set关键字的核心作用
-
对象实例化
Set用于创建服务器组件(如FileSystemObject、ADODB.Connection)的实例:<% Dim fso Set fso = Server.CreateObject("Scripting.FileSystemObject") %>此处
Set将对象引用赋给变量fso,而非传递值。 -
对象引用赋值
当变量指向同一对象时,必须用Set维护引用链:Dim conn1, conn2 Set conn1 = Server.CreateObject("ADODB.Connection") Set conn2 = conn1 ' 正确:conn2与conn1指向同一对象
Set与普通赋值的本质区别
| 操作 | 示例 | 结果 |
|---|---|---|
使用 Set |
Set obj = NewObj |
变量引用对象(内存地址) |
| 普通赋值 | var = 5 |
变量存储值(原始数据) |
典型错误:未用 Set 导致”对象不支持此属性或方法”错误
Dim rs
rs = Server.CreateObject("ADODB.Recordset") ' 错误!缺少Set
rs.Open "SELECT FROM Users" ' 此处将报错
Set的进阶用法与陷阱
释放对象资源
用 Set var = Nothing 显式释放COM对象,减少内存占用:

Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "..."
' ...数据库操作...
conn.Close
Set conn = Nothing ' 关键:释放资源
链式对象引用
嵌套对象操作时需逐层使用 Set:
Dim fso, file
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set file = fso.GetFile("C:data.txt") ' 正确:GetFile返回对象需Set
Response.Write file.Size
常见陷阱
- 循环引用未释放
Set objA = CreateObject("MyComponent") Set objB = CreateObject("MyComponent") Set objA.Child = objB Set objB.Parent = objA ' 循环引用 ' 必须手动解除: Set objA.Child = Nothing Set objB.Parent = Nothing - 未处理错误对象
使用On Error Resume Next时,需检查对象是否创建成功:On Error Resume Next Set conn = Server.CreateObject("ADODB.Connection") If Err.Number <> 0 Then Response.Write "数据库连接失败!" Set conn = Nothing End If
最佳实践与性能优化
-
对象生命周期管理
- 在函数内创建的对象,应在函数退出前用
Set var = Nothing释放。 - 全局对象(如Application级连接池)需在
Application_OnEnd中统一清理。
- 在函数内创建的对象,应在函数退出前用
-
减少频繁创建/销毁
对高开销对象(如数据库连接),使用连接池重复利用:Application.Lock If Not IsObject(Application("DBConn")) Then Set Application("DBConn") = Server.CreateObject("ADODB.Connection") Application("DBConn").Open "..." End If Application.UnLock -
兼容性注意事项
- ASP Classic 仅支持单线程单元(STA)组件,确保第三方DLL注册为
ThreadingModel=Apartment。 - 避免在
Session中存储大型对象(如数据库连接),易引发IIS进程阻塞。
- ASP Classic 仅支持单线程单元(STA)组件,确保第三方DLL注册为
为什么ASP需要Set?设计哲学解析
ASP基于COM(Component Object Model)模型构建,COM对象通过引用计数管理内存,Set 本质是增加/减少引用计数:

- 执行
Set obj = NewObj→ 引用计数+1 - 执行
Set obj = Nothing→ 引用计数-1
当计数归零时,COM自动销毁对象。
独立见解:Set是ASP连接Windows底层COM架构的桥梁,其显式赋值的设计强制开发者关注对象生命周期,避免隐式内存泄漏(如VBScript中无自动垃圾回收)。
迁移到现代技术的建议
若升级至ASP.NET:
- 替换
Set为New关键字(如Dim conn As New SqlConnection())。 - 利用
Using块自动释放资源:Using conn As New SqlConnection(connStr) conn.Open() ' ...操作... End Using ' 自动调用conn.Dispose()
互动讨论
在实际开发中,你是否遇到过因遗漏 Set 导致的隐蔽错误?或在处理大型COM组件(如Excel自动化)时,有哪些优化内存的技巧?欢迎分享你的实战经验!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/8599.html