2011-06-28 20 views
5

我有几个使用FileSystemObject的过程。我觉得这很方便。传递现有的FileSystemObject或创建多个实例

问:将一个现有的FileSystemObject实例从一个“main”过程作为参数传递给这些其他过程,而不是让每个过程都创建自己的FileSystemObject实例是否明智?

例子:这是在任何方面更好地做到这一点:

Sub MainSub() 
    Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
    Call OtherSub(FSO, myargs) 
    ' call other subs and functions that use FileSystemObject 
End Sub 

Sub OtherSub(FSO, myargs) 
    ' Do stuff with FSO 
    ' call other subs and functions that use FileSystemObject 
End Sub 

我已经看到至少一个程序员做的,而不是下面的,这是我平时做:

Sub MainSub() 
    Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
    Call OtherSub(myargs) 
    ' call other subs and functions that use FileSystemObject 
End Sub 

Sub OtherSub(myargs) 
    Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
    Call OtherSub(myargs) 
    ' Do stuff with FSO 
    ' call other subs and functions that use FileSystemObject 
End Sub 

我可以看到做前者的想法,因为这可能会减少与具有多个FileSystemObject实例相关的开销。但每次都必须通过FSO作为论证似乎非常麻烦。严重的是,开销真的很大吗?

回答

1

在我看来,创造许多FSO的开销不是问题;但“你不应该重复自己”,并且每个[哎呀]增加运行时错误的风险。在引擎盖下,只有一个文件系统和一个文件系统对象,所以如果C/C++程序员被允许使用STDOUT或cerr,VBScript/VBA程序员有权使用全局的FSO(你不能做任何事情到一个单身FSO改变其在其他潜艇/功能的工作 - 除了控制变量)。

1

我喜欢在一个类来包装的事情了,而不是从子周围的参数传递到子......

Set c = New MyClass 
c.MainSub 

Class MyClass 

    Dim fso 

    Sub Class_Initialize 
     Set fso = CreateObject("Scripting.FileSystemObject") 
    End Sub 

    Sub Class_Terminate 
     Set fso = Nothing 
    End Sub 

    Public Sub MainSub()  
     OtherSub myargs 
     ' call other subs and functions that use fso 
     ' or use fso here 
    End Sub 

    Public Sub OtherSub myargs 
     ' Do stuff with fso here or call another sub in the class 
    End Sub 
End Class 

+1

假OOP。我喜欢这个。 –

2

我最近做了类似的事情,我个人更喜欢在任何可能的地方使用单个文件系统对象。我认为它是在函数之间传递文件句柄,然后写入打开的文件句柄。

定义函数/子文件时,请务必使用ByRef关键字传递文件系统对象。

唯一不可接受的是如果您正在浏览文件层次结构,并且您需要FSO来维护相同的目录。但是,应该注意的是,在今天的计算机中,单个FSO的内存要求可以忽略不计,如果您需要使用递归函数或反复调用创建/销毁这些对象的函数,则只会注意到性能提升。

相关问题