プロが教えるわが家の防犯対策術!

C#のSystem.Windows.Forms.FormクラスのShowメソッドについて調べています。
Showメソッドを使うことで、モードレスでフォームを表示できます。
http://msdn2.microsoft.com/ja-jp/library/39wcs2d …

例えば、ボタンがクリックされたときに、モードレスでフォームを表示する場合は、以下のようになると思います。

// ボタンがクリックされたときにコールされるメソッド
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

A 回答 (4件)

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

    • good
    • 0

Formをnewすると、自分で書いたプログラムの変数で受け取る参照とは別にフレームワークが内部で参照を持ちます。


なので変数のライフタイムが終了してもフレームワークからの参照は残り続けるので表示されたままです。
既に書かれている通りフレームワークが保持している参照はコレクションから取得できます。

Disposeはフレームワークが保持している参照を破棄させます。
Closeはフォームを閉じるだけです。

> なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。

この理屈だと最初のフォームは表示されること無く(あるいは一瞬で)消えてしまうことになるかと。
    • good
    • 0

色々ややこしい話があったと覚えている上に元ネタ失念なのですが,


Formクラスの中で表示中のForm一覧みたいなコレクションを持っている,
というのが理由だったと思います。

その結果,表示されているFormについては,GC対象にならず表示し続けているのだったと思います。
# 公開された,ソースコードをあたれば一発なのでしょうが……。


ちなみに,インスタンスが生存する期間は,newされてからGCされるまでです。
CloseだのDisposeだのは,Unmanaged Resourceを解放するための手段にすぎません。
    • good
    • 0

fromがnewで実体化されたインスタンス変数だからです


実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なんなとくわかった気がします。

>fromがnewで実体化されたインスタンス変数だからです
失礼ですが、formはインスタンス変数ではなく、ローカル変数だと認識しております。
http://msdn.microsoft.com/library/ja/default.asp …

>実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します
なるほど。
よく考えてみると、ローカル変数formは、言わばC言語のポインタの役割しかしていないため、
それがスコープから外れる外れないに関係なく、インスタンス(=実体化したクラス)はメモリ上に残り続けるとというわけですね。

どうもありがとうございました。

お礼日時:2008/01/28 18:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!