2011-06-28 18 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的內存要求可以忽略不計,如果您需要使用遞歸函數或反覆調用創建/銷燬這些對象的函數,則只會注意到性能提升。

相關問題