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も見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
CloseとDisposeの違い
Visual Basic(VBA)
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
VBの画面サイズについて
Visual Basic(VBA)
-
-
4
Dispose()は、どんな時に使うのですか?
Visual Basic(VBA)
-
5
DoEventsがやはり分からない
Visual Basic(VBA)
-
6
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
7
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
8
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
9
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
10
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
11
VS 2008(VB.NET)
Visual Basic(VBA)
-
12
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
13
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
14
Hideについて(.NET)
Visual Basic(VBA)
-
15
VBでグローバル変数を宣言するには
Visual Basic(VBA)
-
16
変数名の付け方
Java
-
17
FriendとPublicの違い。。。
Visual Basic(VBA)
-
18
Vb.netのグローバル変数の宣言の仕方の質問
Visual Basic(VBA)
-
19
他のフォームから別のフォームのサブルーチンを呼び出す
Visual Basic(VBA)
-
20
タブキー押下時のイベントをひろいたい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
JSPでのArrayListの表示につい...
-
VB2005でADDとINSERTの違いは?
-
Excel VBA 定数にオブジェクト...
-
javaで、、、
-
VB.netでメソッドからコントロ...
-
VB.NETでのnothing の意義について
-
エクセルVBA/SpecialCellsで特...
-
Objectクラスのオブジェクトを...
-
VBAでの[]
-
ArrayListのデバッグ方法について
-
エクセルVBA Property Let とメ...
-
C#のクラスで値渡しをする
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
UMLのクラス図はmain()も含むん...
-
Java初級 引数に適用できません
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VBAでの[]
-
サーブレットコンテキストの意...
-
VB.netでメソッドからコントロ...
-
C#のクラスで値渡しをする
-
Excel VBA 定数にオブジェクト...
-
servletからjspへオブジェクト...
-
VB.NETでのnothing の意義について
-
javaで、、、
-
PrintFormを使用してのプリント
-
Vba ListViewの行挿入に関して...
-
String型からlong型への変換は...
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
C#で親にイベントを投げる方法
-
VBS でのソート処理Excel2003
-
JSPでのArrayListの表示につい...
-
VB2005でADDとINSERTの違いは?
-
[ASP.NET]DropDownListのDB連携...
-
ADOのOPENで実行時エラー
おすすめ情報