

みなさまこんばんわです。よろしくお願い申し上げます。
VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。
これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。
たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。
これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。
そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。
ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。
わけわからなくなってきました。。。
ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。
ここで4つの仮説を立ててみました。
1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる
2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる
3. 呼び出し方ではなく、別の要因が存在する
4. 併記する必要がある場合がある
Me.Close()
Me.Dispose()
または、
Me.Dispose()
Me.Close()
どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。
No.1ベストアンサー
- 回答日時:
Me.Close()
Me.Dispose()
は根本的に違うものです。
formについて、Close()メソッドはフォームの表示を終了させるメソッドです。
ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。
>再利用できる、できないの違い
Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。
一方Close()はインスタンスが残っているので、それを利用することができます。
>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。
通常はどちらでもうまくいきます。
>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる
ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。
>3. 呼び出し方ではなく、別の要因が存在する
そう思います。
>4. 併記する必要がある場合がある
インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。
外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。
Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。
ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。
上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。
蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。
ご回答を賜り、ありがとうございました。そして、お返事が遅くなり、申し訳ございませんでした。
インスタンスの破棄の件につきましては、理解できました。とても勉強になりました。ありがとうございます。
フォームをCloseしたのに、タイマーイベントが実行され続ける意味も分かりました。そのフォームのクラスのインスタンスが残ってたんですね。このようにインスタンスを明示的に破棄する必要がある場合は、おっしゃるとおり、両方併記しなければならない件、よく理解できました。
どうしてもインスタンスを破棄したい場合は、併記をするようにしましたところ、問題は起こっていません。
丁寧なご説明をいただき、ありがとうございました! とても勉強になりました。心より感謝申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
-
4
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
5
VB.NETでのnothing の意義について
Visual Basic(VBA)
-
6
Hideについて(.NET)
Visual Basic(VBA)
-
7
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
8
フォームの存在をチェックする方法
Visual Basic(VBA)
-
9
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
-
10
[VB.net] ボタン(Flat)のEnable時の背景色について
Visual Basic(VBA)
-
11
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
-
12
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
13
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
14
フォームの再読み込み
Visual Basic(VBA)
-
15
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
16
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
17
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
18
DoEventsがやはり分からない
Visual Basic(VBA)
-
19
[VB.net] DataGridViewの列ヘッダー複数行表示に伴う不具合?について
Visual Basic(VBA)
-
20
VB.NETでフォーム上にExcelのような表を表示する方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
セックスレスの既婚女性は自慰...
-
Visual Basic 6.0 コンボボック...
-
エクセルで、日付を入力すると...
-
エクセルVBAで、MsgBox やInput...
-
メルカリのメルカードで買い物...
-
「ご処理進めて頂きますようお...
-
VBAでCOPYを繰り返すと、処理が...
-
PDFフォームに本日の日付を自動...
-
マウスイベントが動かない
-
オブジェクト名をVBAで指定...
-
「PC Helpsoft Driver Updated...
-
UPS警告音を止めたい
-
生活保護受給者は性欲をどんな...
-
お家デートをしててハグを長い...
-
ゲームパットN52Teの設定
-
フォームコントロールから作っ...
-
ACCESSで、新規か更新かの判断
-
背景画像の繰り返しについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
どういうプログラムで組みます...
-
フィールド(メンバ変数)のプリ...
-
VB.NET スプラッシュスクリー...
-
Graphicsプロパティ
-
VBの文法について質問です。
-
C#のインスタンスを参照渡ししたい
-
Pythonについて 関数の仮引数に...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
銀行の窓口処理の件で知ってる...
-
お客様から1MB未満の写真を送っ...
-
UPS警告音を止めたい
-
エクセルVBAで、MsgBox やInput...
-
Excelシート上のマクロを登録し...
-
VBAでCOPYを繰り返すと、処理が...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
おすすめ情報