C#
② Showで同じフォームを2回開いてNRE
出典: C# WinForms の Form.ShowDialog と Form.Show の違いと使い分け完全ガイド — ハマりポイント3つ—俺が踏んだやつ / ② Showで同じフォームを2回開いてNRE
// ❌ NG:押すたびに新しいLogFormが開く
private void btnShowLog_Click(object sender, EventArgs e)
{
var log = new LogForm();
log.Show();
}
// ✅ OK:既に開いてたら前面に出すだけ
private LogForm _logForm;
private void btnShowLog_Click(object sender, EventArgs e)
{
if (_logForm == null || _logForm.IsDisposed)
{
_logForm = new LogForm { Owner = this };
_logForm.FormClosed += (_, __)=> _logForm = null;
_logForm.Show();
}
else
{
_logForm.BringToFront();
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「ハマりポイント3つ—俺が踏んだやつ / ② Showで同じフォームを2回開いてNRE」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
9 件//親フォーム側 private void btnSelectMaster_Click(object sender, EventArgs e) { using (var dlg = new MasterSelectForm())未収録
ShowDialogはモーダル—呼び出し側が止まる
#e8e9c186bc59
//親フォーム側 private ProgressForm _progressForm; private void btnStartImport_Click(object sender, EventArgs e)未収録
Showはモードレス—呼び出し側は動き続ける
#fdb171e5159f
//取引先選択ダイアログを開いて、選ばれたコードを画面に反映する using (var dlg = new TorihikiSelectForm()) { if (dlg.ShowDialog(this)== DialogResult.OK)未収録
1.マスタ参照ダイアログ→ ShowDialog
#71eafd998336
//進捗フォームをShowして、本処理は呼び出し側で並行進行 var progress = new ProgressForm { Owner = this }; progress.Show();未収録
2.進捗・常時表示フォーム→ Show
#cd795de2af89
using (var dlg = new SettingsForm(currentSettings)) { if (dlg.ShowDialog(this)== DialogResult.OK) {未収録
3.設定画面・確認ダイアログ→ ShowDialog
#b50f7b7bc638
// ❌ NG: dlgがGC待ちで残り続ける var dlg = new MasterSelectForm(); dlg.ShowDialog(this); //この後dlgを参照していなくても、Disposeされないので残骸が残る未収録
① ShowDialog後のDispose忘れでメモリ食い続ける
#ff776b9ad022
