C#Form.CloseとForm.Dispose


88

私はC#を初めて使用し、以前の投稿を調べようとしましたが、良い答えが見つかりませんでした。

単一のフォームを持つC#Windowsフォームアプリケーションでは、Form.Close()より良いまたはForm.Dispose()

MSDNによると、オブジェクト内のすべてのリソースが閉じられ、Closeが呼び出されるとフォームが破棄されます。それにもかかわらず、私はオンラインでクローズではなくディスポーズに続くいくつかの例に出くわしました。

一方が他方よりも有利ですか?どのシナリオでどちらを優先する必要がありますか?


わずかに異なる質問、同じ回答、IMO:つまり、CloseとDisposeは通常同等ですが、Closeを複数回呼び出すことができる点が異なります。
ChrisW 2010年

2
@Chrisw:Disposeを複数回呼び出すこともできます。
ヘンクホルターマン2010年

@ ChrisW、Disposeは複数回実行するように設計する必要があります。bluebytesoftware.com/blog/…–
Steven Evers

close == form.Visible = false;ではなくclose === disposeするようになったのは 私は、閉じる方が処分するよりもソフトな方法になると思っていました。
ピートカーカム2010年

4
@Pete Kirkham:必要に応じform.Visible = false;て、に電話することができますform.Hide()。実際には、form.Hide()単にを設定しますthis.Visible = false;
Dirk Vollmar 2010年

回答:


171

MSDNのこのフォーラムで説明しています。

Form.Close()適切なWindowsメッセージを送信して、win32ウィンドウをシャットダウンします。そのプロセス中に、フォームがモーダルで表示されなかった場合、フォームでDisposeが呼び出されます。フォームを破棄すると、フォームが保持している管理されていないリソースが解放されます。

form1.Show()または を実行するApplication.Run(new Form1())と、Close()が呼び出されたときにDisposeが呼び出されます。

ただし、form1.ShowDialog() フォームをモーダルで表示する場合、フォームは破棄されないため、form1.Dispose()自分で電話する必要があります。フォームを自分で処分することを心配する必要があるのはこれだけだと思います。


最初のバージョンには見積もりが含まれていましたか?+1して補正します。
ヘンクホルターマン2010年

@Dan最初のバージョンが吸い込まれました...(申し訳ありませんが@Kyra)
jjnguy 2010年

13
これは、msdn.microsoft.com / en-us / library /でのMSDNの状態とは多少異なります: "フォームがCloseで破棄されない場合の条件のひとつは、フォームがマルチドキュメントインターフェイス(MDI)の一部である場合です。アプリケーションであり、フォームは表示されません。この場合、Disposeを手動で呼び出して、フォームのすべてのコントロールにガベージコレクションのマークを付ける必要があります。」ただし、単純なサンプルを使用すると、モーダルフォームが破棄されているかどうかを簡単に確認できます。
Dirk Vollmar 2010年


14

原則として、メソッドを直接呼び出すか、「using」ブロックでラップすることにより、Disposeメソッドを提供するクラスに対して明示的に呼び出すことを常に推奨します。

ほとんどの場合、IDisposibleを実装するクラスは、解放する必要のあるアンマネージリソースをラップするために実装します。これらのクラスにはセーフガードとして機能するファイナライザーが必要ですが、Disposeを呼び出すと、そのメモリをより早く解放し、オーバーヘッドを減らすことができます。

Formオブジェクトの場合、Kyraからのリンクに記載されているように、Closeメソッドはユーザーに代わってDisposeを呼び出すように文書化されているため、明示的に行う必要はありません。しかし、私には、それは常に実装の詳細に依存しているように感じていました。私は、実装の変更/エラーを防ぎ、明確にするために、それらを実装するクラスに対して常にCloseとDisposeの両方を呼び出すことを好みます。適切に実装されたDisposeメソッドは、複数回呼び出しても安全である必要があります。



6

呼び出しを行わないことは、Closeおそらく、理由を具体的に説明することはできませんが、いくらか重要だと思われる一連のWin32メッセージの送信をバイパスします...

Close部外者(フォームに対して)が監視しFormClosingFormClosedそれに応じて対応できるように、イベント(キャンセル可能)を発生させるという利点があります。

私はかどうかは明らかではないんだけどFormClosing、および/またはFormClosedあなたは、単にフォームを配置けど、私はあなたにして実験することを任せる場合にスローされます。


2
フォームを破棄すると、終了イベントと終了イベントは呼び出されません。
マトリックス

4
Disposeメソッドを呼び出すと、mdi-childウィンドウ上のモーダルフォームで使用するとウィンドウがちらつきます
dotNETbeginner 2011年


0

Close()-管理対象リソースを一時的に閉じて、もう一度開くことができます。

Dispose()-管理対象または管理対象外のリソースを完全に削除します


3
これは、フォームがを使用して表示された場合にのみ当てはまりますShowDialog()。それ以外の場合はClose()、フォームも破棄します。
PeterDuniho19年

-1

フォームでform.close()を使用し、フォームのFormClosingイベントを設定し、このイベントでform.close()を使用すると、無制限のループに陥り、引数が範囲外になり、解決策はフォームを変更することです。 FormClosingのイベントでの.close()とform.dispose()。この小さなヒントがお役に立てば幸いです!!!


-1

VS診断ツールを試してみたところ、this.Close()を呼び出してから、フォームクロージングイベントがトリガーされました。次に、Formcloseingイベントの最後でthis.Dispose()を呼び出して、他の多くのオブジェクトを破棄すると、すべてがはるかにスムーズにクリーンアップされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.