Object 在经典asp中,什么时候我需要将对象设置为零?

Object 在经典asp中,什么时候我需要将对象设置为零?,object,asp-classic,Object,Asp Classic,一方面,总是关闭对象的建议是如此普遍,以至于我会觉得忽略它是愚蠢的(例如) 然而,忽视埃里克·利珀特的智慧同样愚蠢,他似乎不同意: 我一直在努力修复一些经典asp中出现OOM错误的web应用程序。我的第一个(耗时的)任务始终是在代码中搜索未关闭的对象,以及未设置为“无”的对象 但我从来没有100%相信这有帮助。(也就是说,我发现很难准确地指出什么是有帮助的…Eric的这篇文章讨论的是独立的VBScript文件,而不是用VBScript编写的经典ASP。查看评论,然后是Eric自己的评论: 回复:

一方面,总是关闭对象的建议是如此普遍,以至于我会觉得忽略它是愚蠢的(例如)

然而,忽视埃里克·利珀特的智慧同样愚蠢,他似乎不同意:

我一直在努力修复一些经典asp中出现OOM错误的web应用程序。我的第一个(耗时的)任务始终是在代码中搜索未关闭的对象,以及未设置为“无”的对象


但我从来没有100%相信这有帮助。(也就是说,我发现很难准确地指出什么是有帮助的…

Eric的这篇文章讨论的是独立的VBScript文件,而不是用VBScript编写的经典ASP。查看评论,然后是Eric自己的评论:

回复:ASP——很好的观点,而且我没有考虑过。在ASP中,有时很难知道您在哪里以及您所处的范围

因此,从这一点上,我可以说,他写的所有内容都与经典ASP无关,也就是说,您应该始终将所有内容设置为零


至于内存问题,我认为将对象(或数组)分配到全局范围(如会话或应用程序)是此类问题的主要原因。这是我要寻找并重写的第一件事,即在会话中只保留一个标识符,然后使用数据库管理数据。

基本上,通过将COM对象设置为“无”,可以强制其终止符以确定性方式运行,从而使您有机会处理它可能引发的任何错误

如果不这样做,您可能会陷入如下情况:

  • 您的代码引发了一个错误
  • 错误不会在代码中处理,因此
  • 代码中实例化的其他对象超出范围,它们的终止符运行
  • 其中一个终止符引发错误
  • 传播的错误是终止符超出范围的错误,掩盖了原始错误
我确实记得,在黑暗和遥远的过去,有人特别建议关闭ADO对象。我不确定这是因为ADO对象中的错误,还是仅仅因为上述原因(这更普遍地适用于可能在终止符中引发错误的任何对象)


而这一建议虽然常常没有任何可信的理由,但却令人信服。(“虽然ASP应该自动关闭并释放所有对象实例化,但显式关闭并释放对象引用始终是一个好主意”)。

值得注意的是,在本文中,他并不是说您永远不应该担心将对象设置为“无”,只是说它不应该是每个脚本中每个对象的默认行为

虽然我确实怀疑他有点太快,不去理会“我看到了这种别处”的编码行为的方法,但我敢打赌,埃里克没有考虑到这一点有理由把这件事作为一个硬“N”快的规则传递下去——与初级程序员打交道。p> 当你开始更仔细地观察时,你会发现,在获得新技能的最初阶段,学习者需要简单地遵循食谱。他们还不具备做出判断的知识或能力,Eric随后对建议进行了鉴定

回想一下你第一次开始编程的时候。你能很容易地判断你是否“在昂贵的物品超出范围之前就把它们处理好了,那么当你处理完它们时,它们就什么都没有了”?你真的知道哪些东西很贵,或者什么时候它们真的超出了范围吗

因此,大多数入门级程序员都被简单地告知“当您处理完每个对象时,总是将其设置为零”,因为理解和遵循这些对象是在他们的掌握范围之内的。不幸的是,没有多少程序员会花时间自学、学习并成长到更高层次的Dreyfus阶段,在那里您可以使用更微妙的情景方法

然后我们回到我之前的陈述——即使是我们中最优秀的人也开始于那个早期阶段,我们本能地关闭所有对象,因为这是我们所能做到的最好的。我们留下了大量的代码供人们查看,并将我们当前的能力向后投射到早期的工作中,并假设我们这样做是出于我们不理解的原因


我得走了,但我希望进一步扩展一下…

你认为大多数经典ASP都是用什么语言编写的?@Damien_不相信这一点,Eric说的是独立的VBScript文件。会在帖子里说得更清楚他说的是引擎。正如你自己所引用的“有时很难……你在什么范围内”。这与说“当你退出ASP中的作用域时,上面所说的是不正确的”不同。好的,谢谢,这将是我下次检查的第一件事。为什么asp中的vbscript和独立vb中的vbscript的建议会有所不同?我确实又看了EL文章,但没有真正理解它。@MartinHansenLennox-如果我没记错的话,一些范围变化。另外(我想说得更贴切一些)当300多人访问一个页面时,与一个人在桌面上运行脚本相比,一个对象在服务器上消耗内存要容易得多。这对我来说似乎很合理。但在我看来,即使是经验丰富的开发商也会定期提出这一建议。也许是上面提到的asp/standalone vb问题。@MartinHansenLennox很大程度上取决于你所说的“老练”的意思。我知道有10年经验的开发人员,我也知道有一年经验的开发人员连续10年重复工作。我可能应该给自己加一句话:我应该更多地阐述缺乏增长的问题,和/或不太谦虚的开发人员可能会向他们认为“低人一等”的人抛出真理-在某种程度上,领导人们对待每个人都像对待他们处于发展的新手阶段。非常正确。我从不停止学习更多我不知道的东西——或者类似的东西是的,那是a