みなさまこんばんわです。よろしくお願い申し上げます。
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も見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
【お題】 ・世界最古のコンビニについて知ってる事を教えてください
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
Dispose()は、どんな時に使うのですか?
Visual Basic(VBA)
-
-
4
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
5
VBでグローバル変数を宣言するには
Visual Basic(VBA)
-
6
VB.NETでのnothing の意義について
Visual Basic(VBA)
-
7
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
8
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
9
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
10
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
11
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
12
フォームの再読み込み
Visual Basic(VBA)
-
13
変数名の付け方
Java
-
14
Hideについて(.NET)
Visual Basic(VBA)
-
15
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
16
FriendとPublicの違い。。。
Visual Basic(VBA)
-
17
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
18
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
19
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
20
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBA エンターキーでイベントに...
-
switch の範囲指定
-
Excelシート上のマクロを登録し...
-
VBAにてメッセージボックスを最...
-
エクセルVBAで、MsgBox やInput...
-
UPS警告音を止めたい
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
findは動くがfindnextがマクロ...
-
アクセスVBAのMe!と[ ]
-
VBAでループ内で使う変数名を可...
-
2重のDo~Loopは?
-
【Excel】特定の文字を含むセル...
-
月度は何て読みますか?
-
DoEventsがやはり分からない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
VB.NET スプラッシュスクリー...
-
DLL内のイベントをハンドリング
-
C#のインスタンスを参照渡ししたい
-
VC++クラス間のアクセス
-
vb.net フォームアプリケーシ...
-
「ご処理進めて頂きますようお...
-
EXCEL VBA マクロ 実行する度に...
-
エクセルで、日付を入力すると...
-
Excelシート上のマクロを登録し...
-
エクセルVBAで、MsgBox やInput...
-
VBAでループ内で使う変数名を可...
-
メルカリのメルカードで買い物...
-
UPS警告音を止めたい
-
VBA エンターキーでイベントに...
-
DoEventsがやはり分からない
-
【Excel】特定の文字を含むセル...
-
findは動くがfindnextがマクロ...
おすすめ情報