asp-classic – VBScript似乎是来自嵌套作用域的GC’对象,顺序错
我有以下代码:
function p (str) Response.Write VBLF & str end function function nop: end function class Test1 private sub class_initialize p "Test1 Start" end sub private sub class_terminate p "Test1 End" end sub end class class Test2 private sub class_initialize p " Test2 Start" end sub private sub class_terminate p " Test2 End" end sub end class 当我跑: with new Test1 with new Test2 end with end with 我期待输出: Test1 Start Test2 Start Test2 End Test1 End 但我得到: Test1 Start Test2 Start Test1 End Test2 End 但是,如果我运行以下任一项,我会得到我的预期: with new Test1 with new Test2 nop end with end with with new Test1 with new Test2 end with nop end with 但不是以下内容: with new Test1 nop with new Test2 end with end with VBScript对GC的对象有相当强的保证,我在我的应用程序中使用(滥用?)这种保证用于各种目的.没有nop,为什么以“错误”的顺序收集Test1和Test2? 解决方法
多么迷人的bug.
我没有方便的VBScript引擎的调试版本. (自从我上次查看它以来的两年里,我保留它的十年硬盘显然已经坏了.)但是,我可以很容易地猜到这里发生了什么.我怀疑是我没有将对应于“end with”的指令标记为语句结束且收集器必须运行的点. 让我们考虑一下这个假设. 在您的第一个示例中,GC何时运行?程序结束时.此时,终结符按创建对象的顺序运行. (这是您不应该依赖的实现细节.) 在你的第二个和第三个例子中,对nop的调用结束会触发一个GC,这就发生在接下来的结尾处. (我不太清楚为什么第二个例子在对象有资格收集时触发GC;我不记得codegen的确切语义,用于从with block范围中弹出对象引用.) 在您的第四个示例中,GC在内部使用之前触发,并且不执行任何操作. 由于我写了终止逻辑和相当数量的“带”处理代码,我无疑造成了这个错误,所以很多道歉.很明显,在过去的十一年或十二年里,我们与它一起生活并没有出现重大问题,而且由于它只影响没有内容的“有”块,我不认为它会被修复. 无论如何,你不应该依赖终止令.这是一个糟糕的编程习惯. 有关VBScript终止逻辑的迷人主题的更多信息,请参阅: What is the order of destruction of objects in VBScript? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何使用MVC 4制作提交按钮
- 将asp.net应用程序移植到天蓝色有多大挑战?
- asp.net – 在asp:Button中包装文本
- asp.net-mvc – 登录MVC3中的Razor视图
- asp.net-mvc – 使用WCF IOC Structuremap的SOA架构
- asp.net-mvc-4 – 为一个页面使用两个Knockout视图模型
- asp-classic – 如何在经典ASP中使用VBScript生成MD5?
- asp.net core react 项目实战(一)
- .net – appSettings等效于applicationSettings的文件属性
- asp.net-mvc-3 – 找不到概念模型类型
- asp.net – 如何维护N层体系结构中的事务
- asp.net-web-api2 – 使用未绑定功能时具有多个路
- asp.net-mvc – 哪个更适合为我的网站构建API:M
- asp.net-mvc – 如何使用Quartz.net 2.0安排任务
- 单元测试 – 单元测试 – 不能从理论转向实践
- asp.net-mvc-2 – 检测到一个有潜在危险的reques
- asp.net – 有一种简单的方法可以从.NET用户控件
- 如果DataSource不包含任何项目,如何在ASP.NET C#
- asp.net-mvc – 缓存CSS和JS文件
- 加载ASP.Net MVC JSONResult jQuery DataTables