
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 も使えません。
No.1ベストアンサー
- 回答日時:
どんなにがんばっても、明示的に開放することはできません。
nothingすることは、オブジェクトをその変数が参照していない事を示す以外の目的では使えません。
GC.Collect() しても、開放されるかどうか確定しているわけではありません。
open/closeメソッドを追加しても、finalizeしても、解決しません。
表向き使えなくなっているだけで、実際に開放されるかどうかは、.NET Frameworkまかせです。
すばやい回答ありがとうございます。
>どんなにがんばっても、明示的に開放することはできません。
う~ん。確保・解放をプログラマに任せない仕様になっているのですね。
ということは、通常のコーディングでファイルCloseしてもファイルポインタは.NET が内部的に管理してして、Closeして不要になってからファイルポインタ自身が解放されるまでは.NET次第になるわけですね。
No.2
- 回答日時:
Finalize が実行されるのは GCか、プログラムが終了した時、
明示的に実行したい時は Dispose メソッドを実装する必要があります。
objMyFile.Dispose
objMyFile = Nothing
と言う順番にしないと、参照情報だけ削除されて
実態は削除されていない状態になります。
Dispose メソッドやることは、そのクラスで宣言されている
Privateな変数を開放するコードを書きます。
もちろん DisposeでCloseを書く必要があります。
Public な変数は別のメモリ領域にあるのですぐには開放できません
貴重な回答ありがとうございます。
Disposeメソッドで、自身が管理しなければならないものは解放できることを知り、たいへん参考になりました。
ところで、ここまで .NET まかせにするのなら Nothing を代入する必要もないのではないでしょうか?
それとも、Nothing を代入しないで続けてNew したオブジェクトを代入すると、何か不都合なことが発生するのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
CloseとDisposeの違い
Visual Basic(VBA)
-
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
-
4
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
5
VB.NETでフォームロード中のエラー時に終了する方法について
Visual Basic(VBA)
-
6
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
7
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
8
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
9
Excelのプロセスが消えません
Excel(エクセル)
-
10
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
11
ポインタについて
Visual Basic(VBA)
-
12
VB.netでDLLを読み込んで実行する際に、スタックを不安定にしていますというエラーが出ます。
Visual Basic(VBA)
-
13
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
-
14
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
15
VS 2008(VB.NET)
Visual Basic(VBA)
-
16
VBプロジェクトでのフォルダ構成について
Visual Basic(VBA)
-
17
値を返さないコード パス
Visual Basic(VBA)
-
18
カンマ区切りのCSVファイルから"を削除したい
その他(プログラミング・Web制作)
-
19
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ピクチャーボックスに点を打つ...
-
GridViewに行追加するには?
-
サーブレットコンテキストの意...
-
servletからjspへオブジェクト...
-
Vba ListViewの行挿入に関して...
-
VB2005でADDとINSERTの違いは?
-
VBAでの[]
-
VBスクリプトでテキストファイ...
-
String型からlong型への変換は...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
中学のクラス数
-
0歳児の指しゃぶりに関して
-
スーパークラスからサブクラス...
-
変数名の付け方
-
標準モジュールとクラスモジュ...
-
関数内の変数に<summary>コメン...
-
僕の出身中学校は200人同級生が...
-
引数で日付を2つ与え、その間の...
-
UMLのクラス図はmain()も含むん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dispose()は、どんな時に使うの...
-
VB.NETでのnothing の意義について
-
サーブレットコンテキストの意...
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
ピクチャーボックスに点を打つ...
-
C#で親にイベントを投げる方法
-
VB6.0にて、ワールド変換(ピク...
-
VBAでの[]
-
C#のクラスで値渡しをする
-
JSPでのArrayListの表示につい...
-
Vba ListViewの行挿入に関して...
-
String型からlong型への変換は...
-
Javaでブラウザ判定
-
[ASP.NET]DropDownListのDB連携...
-
getHeigth,getWidthについて
-
Objectクラスのオブジェクトを...
-
エクセルVBA/SpecialCellsで特...
おすすめ情報