「みんな教えて! 選手権!!」開催のお知らせ

 VB.NET(.NET環境)ではガーベジコレクションがあるので、オブジェクトの解放はそれほど気を使わなくても良いようですが、やはり明示的に解放したいときがあります。

 例えば下記のようにオブジェクトを解放してから確保したいときなどです。

objMyFile As clsMyFileClass = New clsMyFileClass("SAMPLE1.TXT")
objMyFile.Write("TEST")
objMyFile = Nothing ←ここで解放したい
objMyFile = New clsMyFileClass("SAMPLE2.TXT")
objMyFile.Write("TEST")

 このクラスの Finalize でファイルクローズするようにした場合、Nothing を代入しても Finalize が実行されないようです。

 また、GC.Collect()を使用すると他のオブジェクトのコレクションも実行されるので、ちょっと大げさな感じがします。

 Open と Close メソッドを追加すれば解決しますが、せっかくなので New と Finalize で処理するようにしたいです。なお、VB.NET 2003なのでUsing も使えません。

A 回答 (2件)

どんなにがんばっても、明示的に開放することはできません。


nothingすることは、オブジェクトをその変数が参照していない事を示す以外の目的では使えません。
GC.Collect() しても、開放されるかどうか確定しているわけではありません。
open/closeメソッドを追加しても、finalizeしても、解決しません。
表向き使えなくなっているだけで、実際に開放されるかどうかは、.NET Frameworkまかせです。
    • good
    • 0
この回答へのお礼

すばやい回答ありがとうございます。

>どんなにがんばっても、明示的に開放することはできません。

う~ん。確保・解放をプログラマに任せない仕様になっているのですね。

 ということは、通常のコーディングでファイルCloseしてもファイルポインタは.NET が内部的に管理してして、Closeして不要になってからファイルポインタ自身が解放されるまでは.NET次第になるわけですね。

お礼日時:2007/03/13 11:08

Finalize が実行されるのは GCか、プログラムが終了した時、


明示的に実行したい時は Dispose メソッドを実装する必要があります。
objMyFile.Dispose
objMyFile = Nothing
と言う順番にしないと、参照情報だけ削除されて
実態は削除されていない状態になります。

Dispose メソッドやることは、そのクラスで宣言されている
Privateな変数を開放するコードを書きます。
もちろん DisposeでCloseを書く必要があります。
Public な変数は別のメモリ領域にあるのですぐには開放できません
    • good
    • 0
この回答へのお礼

貴重な回答ありがとうございます。

 Disposeメソッドで、自身が管理しなければならないものは解放できることを知り、たいへん参考になりました。

 ところで、ここまで .NET まかせにするのなら Nothing を代入する必要もないのではないでしょうか?

 それとも、Nothing を代入しないで続けてNew したオブジェクトを代入すると、何か不都合なことが発生するのでしょうか?

お礼日時:2007/03/13 11:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A