
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も見ています
-
CloseとDisposeの違い
Visual Basic(VBA)
-
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
-
4
VB.netでDLLを読み込んで実行する際に、スタックを不安定にしていますというエラーが出ます。
Visual Basic(VBA)
-
5
VB2008で定数に色の設定をしたいです。(初心者)
Visual Basic(VBA)
-
6
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
7
値を返さないコード パス
Visual Basic(VBA)
-
8
Visual Studio 「AnyCpu」について
C言語・C++・C#
-
9
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
10
VBの画面サイズについて
Visual Basic(VBA)
-
11
変数の参照でエラーが出てしまいます。(VB.NET)
Visual Basic(VBA)
-
12
VS 2008(VB.NET)
Visual Basic(VBA)
-
13
VB6からVB2010への変換について
Visual Basic(VBA)
-
14
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
15
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
16
メモリ不足
Visual Basic(VBA)
-
17
VB6で呼び出し元の情報を取得する方法について
Visual Basic(VBA)
-
18
null 参照の例外が実行時に発生する可能性があります
Visual Basic(VBA)
-
19
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
20
Hideについて(.NET)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
HashSetのremoveで例外発生します
-
VB.netでメソッドからコントロ...
-
Excel VBA 定数にオブジェクト...
-
C#のクラスで値渡しをする
-
String型からlong型への変換は...
-
javaScriptで画面に値を入れるには
-
VB.NETでのnothing の意義について
-
C#でのExcel操作について.(Ran...
-
UTF-8のテキストファイルを開く...
-
エクセルVBA/SpecialCellsで特...
-
[ASP.NET]DropDownListのDB連携...
-
C#で親にイベントを投げる方法
-
JSPでのArrayListの表示につい...
-
MessageBox.Show(Me,…の「Me」...
-
WSH OpenTextFile クローズでき...
-
vectorの内容をString型に変換...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
サーブレットコンテキストの意...
-
VBAでの[]
-
Vba ListViewの行挿入に関して...
-
C#のクラスで値渡しをする
-
C#で親にイベントを投げる方法
-
VB.NETでのnothing の意義について
-
javaで、、、
-
Javaでブラウザ判定
-
System.Collections.SortedList
-
VB2005でADDとINSERTの違いは?
-
servletからjspへオブジェクト...
-
mkdirsでフォルダが作成されない
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
UTF-8のテキストファイルを開く...
-
エクセルVBA/SpecialCellsで特...
-
PrintFormを使用してのプリント
おすすめ情報