6

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

然而,忽略 Eric Lippert 的智慧同样愚蠢,他似乎不同意:http: //blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to -set-objects-to-nothing.aspx

我已经在经典的 asp 中修复了许多带有 OOM 错误的 Web 应用程序。我的第一个(耗时)任务总是在代码中搜索未关闭的对象,以及未设置为空的对象。

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

4

3 回答 3

4

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

回复:ASP——很好的观点,也是我没有考虑过的。在 ASP 中,有时很难知道你在哪里以及你在什么范围内。

所以从这里我可以说他写的所有东西都与经典的 ASP 无关,即你应该总是将所有东西都设置为 Nothing。

至于内存问题,我认为将对象(或数组)分配给 Session 或 Application 等全局范围是此类问题的主要原因。这是我要寻找并重写的第一件事,以在 Session 中仅保存单个标识符,然后使用数据库来管理数据。

于 2013-08-01T12:57:16.153 回答
2

基本上,通过将 COM 对象设置为 Nothing,您将强制其终止符确定性地运行,这使您有机会处理它可能引发的任何错误。

如果您不这样做,您可能会遇到以下情况:

  • 您的代码引发错误
  • 该错误未在您的代码中处理,因此...
  • 在您的代码中实例化的其他对象超出范围,并且它们的终止符运行
  • 终结者之一引发错误
  • 并且传播的错误是终止符超出范围的错误,掩盖了原始错误。

我确实记得在黑暗而遥远的过去,特别建议关闭 ADO 对象。我不确定这是因为 ADO 对象中的错误,还是仅仅因为上述原因(更普遍地适用于可能在其终止符中引发错误的任何对象)。

而且这个建议经常被重复,尽管通常没有任何可信的理由。(“虽然 ASP 应该自动关闭并释放所有对象实例化,但最好自己显式地关闭和释放对象引用”)。

于 2013-08-01T13:17:07.647 回答
1

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

虽然我确实怀疑他有点太快地忽略了“我在其他地方看到过”的编码行为方法,但我敢打赌,Eric 认为这是有原因的'n' 快速规则 - 与初级程序员打交道。

当您开始更仔细地研究Dreyfus 技能获取模型时,您会发现在获取新技能的初始阶段,学习者需要简单易懂的食谱。他们尚不具备做出判断的知识或能力,Eric 稍后会对该建议进行限定。

回想一下你刚开始编程的时候。如果您在它们超出范围之前就完成了它们,您是否可以轻松判断您是否“在完成它们时将它们设置为 Nothing”?你真的知道哪些对象是昂贵的,或者它们什么时候真正超出了范围吗?

因此,大多数入门级程序员都被简单地告知“当你完成它时,总是将每个对象设置为 Nothing”,因为这是他们可以理解和遵循的。不幸的是,没有多少程序员花时间自学、学习并成长为更高级别的 Dreyfus 阶段,您可以在其中使用更细微的情境方法。

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

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

于 2013-08-01T14:30:57.200 回答