Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 传递现有FileSystemObject或创建多个实例_Vba_Vbscript_Filesystemobject - Fatal编程技术网

Vba 传递现有FileSystemObject或创建多个实例

Vba 传递现有FileSystemObject或创建多个实例,vba,vbscript,filesystemobject,Vba,Vbscript,Filesystemobject,我有几个使用FileSystemObject的过程。我觉得很方便 问题:将FileSystemObject的现有实例作为参数从“main”过程传递给这些其他过程,而不是让每个过程创建自己的FileSystemObject实例,是否明智 示例:这样做是否更好: Sub MainSub() Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") Call OtherSub(FSO, myargs) ' ca

我有几个使用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的开销不是问题;但是“您不应该重复自己”和每个
CreateObject(“System.FileSystemObject”)
[oops]都会增加运行时错误的风险。在后台,只有一个文件系统和一个文件系统对象,因此如果允许C/C++程序员使用STDOUT或cerr,VBScript/VBA程序员有权使用globalFSO(你不能对一个单独的FSO做任何事,改变它在其他子系统/函数中的工作-除了转换保持变量).

我更喜欢在类中封装东西,而不是在子对象之间传递参数

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

.

我最近做过类似的事情,我个人更喜欢尽可能使用单个文件系统对象。我认为它是在函数之间传递文件句柄,而函数又会写入打开的文件句柄

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

唯一不可接受的情况是,如果您在文件层次结构中导航,并且需要FSO维护相同的目录。然而,应该注意的是,在今天的计算机中,单个FSO的内存需求可以忽略不计,只有在需要使用递归函数或重复调用创建/销毁这些对象的函数时,您才会注意到性能的提高