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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
CloseとDisposeの違い
Visual Basic(VBA)
-
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
-
4
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
5
VBでグローバル変数を宣言するには
Visual Basic(VBA)
-
6
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
7
Dispose()は、どんな時に使うのですか?
Visual Basic(VBA)
-
8
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
9
VS 2008(VB.NET)
Visual Basic(VBA)
-
10
DoEventsがやはり分からない
Visual Basic(VBA)
-
11
FriendとPublicの違い。。。
Visual Basic(VBA)
-
12
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
13
VBの画面サイズについて
Visual Basic(VBA)
-
14
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
15
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
16
DataGridViewで指定したセルの値を取得
Visual Basic(VBA)
-
17
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
18
VBのReturnの使い方
Visual Basic(VBA)
-
19
変数の参照でエラーが出てしまいます。(VB.NET)
Visual Basic(VBA)
-
20
VB.net Double と Decimal の違い?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サーブレットコンテキストの意...
-
Objectクラスのオブジェクトを...
-
VB.NETでのnothing の意義について
-
JTableで値を右寄せ表示する方法
-
JSPでのArrayListの表示につい...
-
エクセルVBA 画像を貼り付ける...
-
[ASP.NET]DropDownListのDB連携...
-
servletからjspへオブジェクト...
-
vectorの内容をString型に変換...
-
ピクチャーボックスに点を打つ...
-
VB.netでメソッドからコントロ...
-
GridViewに行追加するには?
-
VBAでの[]
-
オブジェクトの参照渡しについて
-
getParameter()について
-
UTF-8のテキストファイルを開く...
-
String型からlong型への変換は...
-
MIME::Parserのparse_dataメソ...
-
VBA Workbooks.open
-
Excel VBA 定数にオブジェクト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでの[]
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
Vba ListViewの行挿入に関して...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
VBスクリプトでテキストファイ...
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
エクセルVBA/SpecialCellsで特...
-
getParameter()について
-
VBS でのソート処理Excel2003
おすすめ情報