5

FileSystemObject を使用する手順がいくつかあります。かなり便利だと思います。

質問: 各プロシージャに FileSystemObject の独自のインスタンスを作成させるのではなく、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 

これは、私が通常行っている次のことではなく、少なくとも 1 人のプログラマーが行っているのを見たことがあります。

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 を引数として渡さなければならないのは非常に面倒です。真剣に、オーバーヘッドは本当にそんなに大きいのでしょうか?

4

3 に答える 3

2

私は最近このようなことをしましたが、個人的には可能な限り単一のファイル システム オブジェクトを使用することを好みます。関数間でファイル ハンドルを渡し、開いているファイル ハンドルに書き込みます。

ByRef関数/サブルーチンを定義するときは、キーワードを使用してファイル システム オブジェクトを渡すようにしてください。

これが受け入れられないのは、ファイル階層をナビゲートしていて、同じディレクトリを維持するために FSO が必要な場合だけです。ただし、単一の FSO のメモリ要件は、今日のコンピューターでは無視できる程度であり、再帰関数を使用する必要がある場合、またはこれらのオブジェクトを作成/破棄する関数を繰り返し呼び出す必要がある場合にのみ、パフォーマンスの向上に気付くことに注意してください。

于 2011-06-29T14:46:44.577 に答える
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

于 2011-06-29T12:57:44.583 に答える
1

私の意見では、多くの FSO を作成するオーバーヘッドは問題ではありません。しかし、「あなたは自分自身を繰り返すべきではありません」と、CreateObject( "System.FileSystemObject" )[oops] ごとに実行時エラーのリスクが高まります。内部では、1 つのファイル システムと 1 つのファイル システム オブジェクトが厳密に存在するため、C/C++ プログラマが STDOUT または cerr の使用を許可されている場合、VBScript/VBA プログラマはグローバルFSO に対する権利を持ちます (ファイル システム オブジェクトに対しては何もできません)。他のサブ/関数で動作を変更するシングルトン FSO - 保持変数のザッピングを除く)。

于 2011-06-28T18:46:05.040 に答える