gpt4 book ai didi

asp-classic - VBScript 似乎是以错误的顺序从嵌套作用域中 GC 的对象

转载 作者:行者123 更新时间:2023-12-04 02:51:05 26 4
gpt4 key购买 nike

我有以下代码:

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 ,为什么要收藏 Test1Test2以“错误”的顺序?

最佳答案

多么迷人的错误。

我手边没有 VBScript 引擎的调试版本。 (自从我上次看它以来,我保存它的十年前的硬盘显然已经坏了两年了。)但是,我可以很容易地猜到这里发生了什么。我的怀疑是我没有将对应于“end with”的指令标记为语句结束且收集器必须运行的点。

让我们考虑一下这个假设。

在您的第一个示例中,GC 何时运行?节目结束时。此时,终止符将按照对象的创建顺序运行。 (这是您不应依赖的实现细节。)

在您的第二个和第三个示例中,对 nop 调用的结束触发了 GC,这发生在结尾的旁边。 (我不太确定为什么第二个示例在对象符合收集条件时会触发 GC;我不记得代码生成器用于从 with 块范围中弹出对象引用的确切语义。)

在您的第四个示例中,GC 在内部 with 之前触发,并且什么都不做。

由于我同时编写了终止逻辑和相当数量的“with”处理代码,我无疑导致了这个错误,非常抱歉。显然,在过去的十一或十二年里,我们一直使用它而没有出现重大问题,而且由于它只影响没有内容的“with”块,我认为它永远不会被修复。

无论如何,您不应该依赖终止命令。这是一种糟糕的编程习惯。

有关 VBScript 终止逻辑的迷人主题的更多信息,请参阅:

What is the order of destruction of objects in VBScript?

关于asp-classic - VBScript 似乎是以错误的顺序从嵌套作用域中 GC 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com