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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
2024年に成し遂げたこと
今年も残すところわずか。 皆さんが今年達成したことを教えていただきたいです。 どんな小さなものでも構いません。
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
CloseとDisposeの違い
Visual Basic(VBA)
-
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
-
4
VBの画面サイズについて
Visual Basic(VBA)
-
5
変数の参照でエラーが出てしまいます。(VB.NET)
Visual Basic(VBA)
-
6
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
7
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
8
変数名の付け方
Java
-
9
FriendとPublicの違い。。。
Visual Basic(VBA)
-
10
DoEventsがやはり分からない
Visual Basic(VBA)
-
11
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
12
Hideについて(.NET)
Visual Basic(VBA)
-
13
null 参照の例外が実行時に発生する可能性があります
Visual Basic(VBA)
-
14
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
15
VB.NETで参照設定したDLLの修正反映
Visual Basic(VBA)
-
16
VS 2008(VB.NET)
Visual Basic(VBA)
-
17
VB6からVB2010への変換について
Visual Basic(VBA)
-
18
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
19
他のフォームから別のフォームのサブルーチンを呼び出す
Visual Basic(VBA)
-
20
ExecuteNonQueryメソッドの戻り値
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
C#のクラスで値渡しをする
-
Excel VBA 定数にオブジェクト...
-
VBスクリプトでテキストファイ...
-
VB.netでメソッドからコントロ...
-
オブジェクトの参照渡しについて
-
サーブレットコンテキストの意...
-
javaで、、、
-
Visual BasicでJavaアプレット...
-
JSPでのArrayListの表示につい...
-
VBAでの[]
-
UTF-8のテキストファイルを開く...
-
ADOのOPENで実行時エラー
-
VB6 グレープシティ社スプレッ...
-
javaScriptで画面に値を入れるには
-
vectorの内容をString型に変換...
-
getHeigth,getWidthについて
-
ピクチャーボックスに点を打つ...
-
PrintFormを使用してのプリント
-
ArrayListはオブジェクトのポイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
サーブレットコンテキストの意...
-
VBAでの[]
-
C#のクラスで値渡しをする
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
VBスクリプトでテキストファイ...
-
Vba ListViewの行挿入に関して...
-
JSPでのArrayListの表示につい...
-
C#で親にイベントを投げる方法
-
VB2005でADDとINSERTの違いは?
-
PrintFormを使用してのプリント
-
ピクチャーボックスに点を打つ...
-
Dispose()は、どんな時に使うの...
-
mkdirsでフォルダが作成されない
-
System.Collections.SortedList
-
MessageBox.Show(Me,…の「Me」...
おすすめ情報