2011-12-24 26 views

答えて

40

いずれもどちらか一方が他方より「良い」ものではない。彼らは完全に同等です!

しかし、この特定のケースでは、はどちらも間違っていますです。 ShowDialog methodには、フォーム上でDisposeメソッドを呼び出す必要があります。 ShowCloseの組み合わせとは異なり、これは自動的に行われません。 MSDNから:

フォームはモーダルダイアログボックスとして表示されたら、[閉じる]ボタン(フォームの右上隅にあるXの付いたボタン)をクリックすると、フォームを非表示にする原因となり、DialogResultプロパティDialogResult.Cancelに設定します。非モーダルフォームとは異なり、ユーザーがダイアログボックスのフォームを閉じるボタンをクリックするか、DialogResultプロパティの値を設定すると、Closeメソッドが.NET Frameworkによって呼び出されません。代わりにフォームが非表示になり、ダイアログボックスの新しいインスタンスを作成せずに再び表示できます。ダイアログボックスとして表示されたフォームは閉じずに隠されているため、アプリケーションでフォームが不要になったときにフォームのDisposeメソッドを呼び出す必要があります。

したがって、あなたは、これらの(等価)のいずれかの形式の間で選択する必要があります、ShowDialogは自動的にフォームを配置しないことを理由は十分に簡単である

using (Form1 frm = new Form1()) 
{ 
    frm.ShowDialog(); 
} 

または

Form1 frm = new Form1(); 
frm.ShowDialog(); 
frm.Dispose(); 

すぐには分かりません。アプリケーションは、フォームのコントロールで指定された設定など、フォームが閉じられた後に、モーダルダイアログフォームのインスタンスから値を読み取ろうとしていることがよくあります。フォームが自動的に破棄された場合は、フォームオブジェクトのプロパティにアクセスしてこれらの値を読み取ることはできません。したがって、プログラマは、モーダルダイアログとして表示されたフォームを処分する際には、モーダルダイアログとして表示されたフォームを処分する責任があります。

+0

MODALがメモリ内のフォームを保持して、自動解放されずに閉じられたときに他の要素を抽出する理由についての優れた説明。 – DRapp

+0

明確にする:フォームインスタンスがローカル変数に保持されている場合、範囲外になったときにガベージコレクションの対象となり、最終的に破棄されます(このSO [answer](http://stackoverflow.com)参照)。/a/11690188/945456))。もちろん明示的にそれを行うことをお勧めします。 –

+0

残りの部分を除いて、最初の文は**間違った**です。 'frm.Dispose();'を呼び出す必要があるので、第2のものは最初のものより悪いです。その後の良い答えを見て、恥ずかしながら! – Bitterblue

2

あなたが後でフォームにアクセスすることができますので、一般的に、私は最初の1のために行くだろう。

それ以外の場合は、2回目は閉じられた後で対処したくない場合は2回目です。

+0

メモリはdispose()at(new form1())。showDialog(); ? –

+0

あなたは、showdialogの終了後にメモリが破棄されているかどうか尋ねています。そうであれば、C#のどのオブジェクトのメモリも、もう何も参照しなくなると、それは破棄されます。したがって、ダイアログが閉じられると、すべての参照がなくなり、GCがその処理を行います。 –

関連する問題