• ベストアンサー

[C#]FormクラスのShowメソッドの挙動について

C#のSystem.Windows.Forms.FormクラスのShowメソッドについて調べています。 Showメソッドを使うことで、モードレスでフォームを表示できます。 http://msdn2.microsoft.com/ja-jp/library/39wcs2dh.aspx 例えば、ボタンがクリックされたときに、モードレスでフォームを表示する場合は、以下のようになると思います。 // ボタンがクリックされたときにコールされるメソッド private void button1_Click(object sender, EventArgs e) { MyForm form = new MyForm(); // MyFormはFormの継承クラス form.Show(); } このとき、button1_Clickメソッドが終了しても、 つまり、変数formのスコープから処理が外れても、MyFormは表示され続けます。 別スレッドで表示しているのかと思いましたが、MyFormを表示してもスレッド数は変わりませんでした。 なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。 どなたかご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。 環境 : WindowsXP SP2, .NET Framework 2.0, Visual Studio 2005

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

色々ややこしい話があったと覚えている上に元ネタ失念なのですが, Formクラスの中で表示中のForm一覧みたいなコレクションを持っている, というのが理由だったと思います。 その結果,表示されているFormについては,GC対象にならず表示し続けているのだったと思います。 # 公開された,ソースコードをあたれば一発なのでしょうが……。 ちなみに,インスタンスが生存する期間は,newされてからGCされるまでです。 CloseだのDisposeだのは,Unmanaged Resourceを解放するための手段にすぎません。

その他の回答 (3)

  • isle
  • ベストアンサー率51% (77/150)
回答No.4

フレームワークは保持している参照を使って順番にフォームへイベントを通知してやるだけで良いので、メインスレッドひとつで済みます。

  • isle
  • ベストアンサー率51% (77/150)
回答No.3

Formをnewすると、自分で書いたプログラムの変数で受け取る参照とは別にフレームワークが内部で参照を持ちます。 なので変数のライフタイムが終了してもフレームワークからの参照は残り続けるので表示されたままです。 既に書かれている通りフレームワークが保持している参照はコレクションから取得できます。 Disposeはフレームワークが保持している参照を破棄させます。 Closeはフォームを閉じるだけです。 > なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。 この理屈だと最初のフォームは表示されること無く(あるいは一瞬で)消えてしまうことになるかと。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

fromがnewで実体化されたインスタンス変数だからです 実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します

mamorix
質問者

お礼

ご回答ありがとうございます。 なんなとくわかった気がします。 >fromがnewで実体化されたインスタンス変数だからです 失礼ですが、formはインスタンス変数ではなく、ローカル変数だと認識しております。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/csspec/html/vclrfcsharpspec_1_3.asp >実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します なるほど。 よく考えてみると、ローカル変数formは、言わばC言語のポインタの役割しかしていないため、 それがスコープから外れる外れないに関係なく、インスタンス(=実体化したクラス)はメモリ上に残り続けるとというわけですね。 どうもありがとうございました。