

みなさまこんばんわです。よろしくお願い申し上げます。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Access(アクセス) Accessでセレクタをダブルクリックで別フォームで詳細表示 3 2022/12/20 10:36
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) テキストボックスの値をテーブルに入力したい 2 2022/06/28 12:08
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) Access DLookup vbaで条件を2件設定したい場合どうすればよいでですか? 現在 If( 1 2023/06/28 14:28
- その他(OS) windows10のダウンロード 3 2022/03/30 10:12
このQ&Aを見た人はこんなQ&Aも見ています
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
-
4
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
-
5
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
6
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
7
フォームの再読み込み
Visual Basic(VBA)
-
8
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
9
フォームの存在をチェックする方法
Visual Basic(VBA)
-
10
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
11
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
12
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
-
13
DoEventsがやはり分からない
Visual Basic(VBA)
-
14
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
15
FriendとPublicの違い。。。
Visual Basic(VBA)
-
16
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
17
Hideについて(.NET)
Visual Basic(VBA)
-
18
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
19
値を返さないコード パス
Visual Basic(VBA)
-
20
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
Objective-c 画面遷移について
-
objective-C(Xcode)に関して...
-
vb.net フォームアプリケーシ...
-
VB.NET スプラッシュスクリー...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
エクセルVBAで、MsgBox やInput...
-
Excelシート上のマクロを登録し...
-
Googleフォーム・複数人の申し...
-
「PC Helpsoft Driver Updated...
-
男性に対して、『女性への気遣...
-
switch の範囲指定
-
コマンドプロンプトの時間がか...
-
(VBA)チェックボックスのclick...
-
実験ノート作成用テンプレート...
-
EXCEL VBA マクロ 実行する度に...
-
VBA エンターキーでイベントに...
-
グーグル地図 ストリートビュ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
VB.NET スプラッシュスクリー...
-
VC++クラス間のアクセス
-
フィールド(メンバ変数)のプリ...
-
C#のインスタンスを参照渡ししたい
-
vb.net フォームアプリケーシ...
-
DLL内のイベントをハンドリング
-
Objective-c 画面遷移について
-
どういうプログラムで組みます...
-
objective-C(Xcode)に関して...
-
Javaのあれやこれや
-
コールバックでイベントを使う...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
Excelシート上のマクロを登録し...
-
VBA エンターキーでイベントに...
-
エクセルVBAで、MsgBox やInput...
-
VBAでループ内で使う変数名を可...
おすすめ情報