web-dev-qa-db-ja.com

オブジェクトを破壊する方法

のようだ Set Object = Nothingは、このコードのFsオブジェクトを破棄しませんでした:

Sub Test2()
    Dim Fs As New FileSystemObject
    Set Fs = Nothing
    MsgBox Fs.Drives.Count ' this line works
End Sub

最後の行はエラーなしで動作します!。つまり、Fsオブジェクトはまだ存在しますよね。

では、このFsオブジェクトを破棄する方法を説明します。

15
Fadi

オブジェクトを適切に破棄する別の方法は、Withブロックへのオブジェクト参照を生成することです(つまり、ローカル変数を宣言しないでください)。

Sub Test()
    With New FileSystemObject
        MsgBox .Drives.Count
    End With
End Sub

オブジェクトはWithブロック内にのみ存在し、実行がEnd Withトークンに到達すると、カスタムクラスモジュールで試行すると、クラスのClass_Terminateハンドラーが実行され、適切な破棄が効果的に確認されます。オブジェクトの。

As Newの癖について すでに説明したように 、そのスコープ内でオブジェクト参照をNothingに設定する場合は、As Newを使用して宣言しないでください。VBAwillオブジェクト参照をNothingに設定しますが、オブジェクトを確認するためだけに再参照するとすぐに、新しいインスタンスが作成されます(「役立つ」)。 Is Nothing

補足として、この(迷惑な)直観に反する動作は、具体的には Rubberduck の推論の背後にあるものですオブジェクト変数は自己割り当てですコードインスペクション:

RD website's inspection results

(注:検査したいコードがある場合は、実際のVBEでWebサイトよりもmuch高速に実行されることを確認してください)

(まだ明確になっていない場合:私はRubberduckプロジェクトに深く関わっています)

16
Mathieu Guindon

「宣言してインスタンス化する」パターンに関係する必要があり、ほとんどの場合「回避する」パターンとして扱われます

それらを分割すると、次のように設定した後にNothingを取得します。

Sub Test2()
    Dim Fs As FileSystemObject
    Set Fs = New FileSystemObject
    Set Fs = Nothing
    MsgBox Fs.Drives.Count ' this line DOESN'T work
End Sub
17
user3598756

この修正されたコードは正常に動作するようです。同じ行にdim/newのニュアンスがあるようです。うまくいけば、他の誰かが推論に関してより良いアイデアを与えることができます。

他の人がコメントしたように、それが潜水艦内で薄暗い場合、それはとにかく潜水艦が完了した後に収集されます。

Sub Test2()
    Dim Fs As FileSystemObject
    Set Fs = New FileSystemObject
    Set Fs = Nothing
End Sub
11
Zerk