みなさまこんばんわです。よろしくお願い申し上げます。
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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
Dispose()は、どんな時に使うのですか?
Visual Basic(VBA)
-
-
4
Hideについて(.NET)
Visual Basic(VBA)
-
5
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
6
FriendとPublicの違い。。。
Visual Basic(VBA)
-
7
フォームの再読み込み
Visual Basic(VBA)
-
8
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
9
VB.NETでのnothing の意義について
Visual Basic(VBA)
-
10
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
-
11
DoEventsがやはり分からない
Visual Basic(VBA)
-
12
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
13
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
14
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
15
TCP/IP通信時のサーバーからの受信
C言語・C++・C#
-
16
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
17
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
18
Visual Studio 「AnyCpu」について
C言語・C++・C#
-
19
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
20
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
DLL内のイベントをハンドリング
-
C# 超初心者です。 this.Refres...
-
C#のインスタンスを参照渡ししたい
-
コールバックでイベントを使う...
-
「ご処理進めて頂きますようお...
-
【Excel】特定の文字を含むセル...
-
エクセルで、日付を入力すると...
-
Excelシート上のマクロを登録し...
-
EXCEL VBA マクロ 実行する度に...
-
メルカリのメルカードで買い物...
-
switch の範囲指定
-
VBAでループ内で使う変数名を可...
-
VBA SaveChanges 上書きされない
-
エクセルVBAで、MsgBox やInput...
-
DoEventsがやはり分からない
-
UPS警告音を止めたい
-
Visual Basic 6.0 コンボボック...
-
アクセスVBAのMe!と[ ]
-
UMLでの例外処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
コールバックでイベントを使う...
-
C#のインスタンスを参照渡ししたい
-
C#で引数を渡して、スレッド用...
-
DLL内のイベントをハンドリング
-
フィールド(メンバ変数)のプリ...
-
[swift]動的なキーを持つJSONの...
-
Try~Catch、Finallyについて。
-
Objective-c 画面遷移について
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
Excelシート上のマクロを登録し...
-
【Excel】特定の文字を含むセル...
-
エクセルVBAで、MsgBox やInput...
-
EXCEL VBA マクロ 実行する度に...
-
アクセスVBAのMe!と[ ]
おすすめ情報