2011-04-29 19 views
3

在一个运行在WSH中并创建对象的Javascript程序中,让我们说Scripting.FileSystemObject或任何任意的COM对象,当我完成它时,是否需要将该变量设置为null?例如,我是否建议这样做:,当完成通过新ActiveXObject创建的对象时,是否需要将它设置为null?

var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var fileStream = fso.openTextFile(filename); 
fso = null; // recommended? necessary? 
... use fileStream here ... 
fileStream.Close(); 
fileStream = null; // recommended? necessary? 

效果不同于让瓦尔斯超出范围吗?

回答

5

对象变量赋值为null将递减引用计数器,以便存储管理系统可以丢弃的资源 - 只要感觉它。当变量超出范围时,引用计数器将自动递减。因此,手动操作几乎在所有情况下都浪费时间。

在理论上使用在其第一大对象A,并在其第二部分中的另一大对象B,如果A被设定为空的中间可以更高效的存储器的功能。但是因为这不会迫使MMS消灭A,这种说法可能仍然是一种浪费。

如果你做了一些奇特的类设计,你可能会得到循环引用。然后手工打破这个圈子可能是必要的 - 但也许首先避免这样的循环会更好。

有关于古代数据库访问对象的传言可以通过切换变量来避免错误。我不会将我的编程规则基于这样的巫术。

(这里有很多在互联网上VBScript代码是十足的“设置X =无”;当记者问,笔者倾向于谈论“习惯”和其他语言(C,C++))

1

建立在什么Ekkehard.Horner说...

脚本如VBScript,JScript和ASP是管理内存为您的环境中执行。因此,明确地将对象引用设置为Null或Empty,不一定会将其从内存中移除......至少不是马上。 (在实践中,它通常几乎是瞬时的,但实际上,任务被添加到稍后在某个时间点执行的环境中的队列中)。在这方面,它实际上比您想象的要少得多。

在编译的代码,它来清理内存是很重要的一个程序(或在某些情况下,代码段)结束之前,让任何分配的内存返回到系统。这可以防止各种问题。在缓慢运行的代码之外,当程序退出时这是最重要的。在ASP或WSH等脚本环境中,当脚本退出时,内存管理会自动处理此清理。因此,即使您没有明确地自行执行,也会将所有对象引用设置为null,这使得在此实例中不需要整个混乱。就脚本执行过程中的内存问题而言,如果构建的数组或字典对象的大小足以引发问题,那么您已经超出了脚本的范围,或者在代码中采用了错误的方法。换句话说,这应该是绝不会在VBScript中发生。事实上,环境对数组和字典对象的大小施加了限制,以便首先防止这些问题。

0

如果长期运行在顶部使用对象的脚本/启动,这是在主要的过程中不需要,设置这些对象为null,可以更快地释放内存,也不会做任何伤害。正如其他海报所提到的那样,可能没有实际的好处。

相关问题