これは、モーダルダイアログを表示するためのより良い方法ですか?Form.ShowDialog()を呼び出すより良い方法はありますか?
form1 frm=new form1();
frm.showDialog()
または
(new form1()).showDialog();
これは、モーダルダイアログを表示するためのより良い方法ですか?Form.ShowDialog()を呼び出すより良い方法はありますか?
form1 frm=new form1();
frm.showDialog()
または
(new form1()).showDialog();
いずれもどちらか一方が他方より「良い」ものではない。彼らは完全に同等です!
しかし、この特定のケースでは、はどちらも間違っていますです。 ShowDialog
methodには、フォーム上でDispose
メソッドを呼び出す必要があります。 Show
とClose
の組み合わせとは異なり、これは自動的に行われません。 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();
すぐには分かりません。アプリケーションは、フォームのコントロールで指定された設定など、フォームが閉じられた後に、モーダルダイアログフォームのインスタンスから値を読み取ろうとしていることがよくあります。フォームが自動的に破棄された場合は、フォームオブジェクトのプロパティにアクセスしてこれらの値を読み取ることはできません。したがって、プログラマは、モーダルダイアログとして表示されたフォームを処分する際には、モーダルダイアログとして表示されたフォームを処分する責任があります。
あなたが後でフォームにアクセスすることができますので、一般的に、私は最初の1のために行くだろう。
それ以外の場合は、2回目は閉じられた後で対処したくない場合は2回目です。
メモリはdispose()at(new form1())。showDialog(); ? –
あなたは、showdialogの終了後にメモリが破棄されているかどうか尋ねています。そうであれば、C#のどのオブジェクトのメモリも、もう何も参照しなくなると、それは破棄されます。したがって、ダイアログが閉じられると、すべての参照がなくなり、GCがその処理を行います。 –
MODALがメモリ内のフォームを保持して、自動解放されずに閉じられたときに他の要素を抽出する理由についての優れた説明。 – DRapp
明確にする:フォームインスタンスがローカル変数に保持されている場合、範囲外になったときにガベージコレクションの対象となり、最終的に破棄されます(このSO [answer](http://stackoverflow.com)参照)。/a/11690188/945456))。もちろん明示的にそれを行うことをお勧めします。 –
残りの部分を除いて、最初の文は**間違った**です。 'frm.Dispose();'を呼び出す必要があるので、第2のものは最初のものより悪いです。その後の良い答えを見て、恥ずかしながら! – Bitterblue