みなさまこんばんわです。よろしくお願い申し上げます。
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も見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
うちのカレーにはこれが入ってる!って食材ありますか?
カレーって同じルーから作っても、家庭によって入っているものや味が微妙に違っていて面白いですよね! 「我が家のカレーにはこれが入ってるよ!」 という食材や調味料はありますか?
-
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
-
4
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
5
Dispose()は、どんな時に使うのですか?
Visual Basic(VBA)
-
6
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
7
VBでグローバル変数を宣言するには
Visual Basic(VBA)
-
8
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
9
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
10
フォームの再読み込み
Visual Basic(VBA)
-
11
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
12
変数名の付け方
Java
-
13
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
14
Hideについて(.NET)
Visual Basic(VBA)
-
15
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
16
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
17
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
18
Integer変数をカラにしたいのですが
Visual Basic(VBA)
-
19
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
-
20
【C#】DataGridViewの最大列数について
システム
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
どういうプログラムで組みます...
-
「ご処理進めて頂きますようお...
-
「PC Helpsoft Driver Updated...
-
お家デートをしててハグを長い...
-
UPS警告音を止めたい
-
Excelシート上のマクロを登録し...
-
エクセルで、日付を入力すると...
-
WPFでの時刻入力コントロールに...
-
VBAでループ内で使う変数名を可...
-
VBA エンターキーでイベントに...
-
月度は何て読みますか?
-
エクセルVBAで、MsgBox やInput...
-
【Excel VBA】マクロボタンを表...
-
エクセルVBA マクロ処理中のポ...
-
アクセスVBAのMe!と[ ]
-
(VBA)チェックボックスのclick...
-
メルカリのメルカードで買い物...
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
VB.NET スプラッシュスクリー...
-
C#のインスタンスを参照渡ししたい
-
OCXのメソッドの引数に文字列を...
-
[C#]FormクラスのShowメソッド...
-
コールバックでイベントを使う...
-
どういうプログラムで組みます...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
「PC Helpsoft Driver Updated...
-
Excelシート上のマクロを登録し...
-
VBAでループ内で使う変数名を可...
-
エクセルVBAで、MsgBox やInput...
-
VBA エンターキーでイベントに...
-
switch の範囲指定
-
UPS警告音を止めたい
-
UMLでの例外処理
-
VBの質問#if 0 then ってどう...
-
インタラクティブの反対語は?
おすすめ情報