• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CloseとDisposeの違い)

CloseとDisposeの違い

このQ&Aのポイント
  • CloseとDisposeの違いについて教えていただきたいです。
  • CloseとDisposeの使用方法の違いや、フォームを閉じる際にどちらを使用すべきかについて調べています。
  • Me.Close()とMe.Dispose()の使い方と、それぞれの違いについて教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答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メソッドを要求することはできないためです。

suiyoudoudesyou
質問者

お礼

ご回答を賜り、ありがとうございました。そして、お返事が遅くなり、申し訳ございませんでした。 インスタンスの破棄の件につきましては、理解できました。とても勉強になりました。ありがとうございます。 フォームをCloseしたのに、タイマーイベントが実行され続ける意味も分かりました。そのフォームのクラスのインスタンスが残ってたんですね。このようにインスタンスを明示的に破棄する必要がある場合は、おっしゃるとおり、両方併記しなければならない件、よく理解できました。 どうしてもインスタンスを破棄したい場合は、併記をするようにしましたところ、問題は起こっていません。 丁寧なご説明をいただき、ありがとうございました! とても勉強になりました。心より感謝申し上げます。