
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
No.2ベストアンサー
- 回答日時:
色々ややこしい話があったと覚えている上に元ネタ失念なのですが,
Formクラスの中で表示中のForm一覧みたいなコレクションを持っている,
というのが理由だったと思います。
その結果,表示されているFormについては,GC対象にならず表示し続けているのだったと思います。
# 公開された,ソースコードをあたれば一発なのでしょうが……。
ちなみに,インスタンスが生存する期間は,newされてからGCされるまでです。
CloseだのDisposeだのは,Unmanaged Resourceを解放するための手段にすぎません。
No.3
- 回答日時:
Formをnewすると、自分で書いたプログラムの変数で受け取る参照とは別にフレームワークが内部で参照を持ちます。
なので変数のライフタイムが終了してもフレームワークからの参照は残り続けるので表示されたままです。
既に書かれている通りフレームワークが保持している参照はコレクションから取得できます。
Disposeはフレームワークが保持している参照を破棄させます。
Closeはフォームを閉じるだけです。
> なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。
この理屈だと最初のフォームは表示されること無く(あるいは一瞬で)消えてしまうことになるかと。
No.1
- 回答日時:
fromがnewで実体化されたインスタンス変数だからです
実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します
ご回答ありがとうございます。
なんなとくわかった気がします。
>fromがnewで実体化されたインスタンス変数だからです
失礼ですが、formはインスタンス変数ではなく、ローカル変数だと認識しております。
http://msdn.microsoft.com/library/ja/default.asp …
>実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します
なるほど。
よく考えてみると、ローカル変数formは、言わばC言語のポインタの役割しかしていないため、
それがスコープから外れる外れないに関係なく、インスタンス(=実体化したクラス)はメモリ上に残り続けるとというわけですね。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
セックスレスの既婚女性は自慰...
-
Visual Basic 6.0 コンボボック...
-
エクセルで、日付を入力すると...
-
エクセルVBAで、MsgBox やInput...
-
メルカリのメルカードで買い物...
-
「ご処理進めて頂きますようお...
-
VBAでCOPYを繰り返すと、処理が...
-
PDFフォームに本日の日付を自動...
-
マウスイベントが動かない
-
オブジェクト名をVBAで指定...
-
「PC Helpsoft Driver Updated...
-
UPS警告音を止めたい
-
生活保護受給者は性欲をどんな...
-
お家デートをしててハグを長い...
-
ゲームパットN52Teの設定
-
フォームコントロールから作っ...
-
ACCESSで、新規か更新かの判断
-
背景画像の繰り返しについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
どういうプログラムで組みます...
-
フィールド(メンバ変数)のプリ...
-
VB.NET スプラッシュスクリー...
-
Graphicsプロパティ
-
VBの文法について質問です。
-
C#のインスタンスを参照渡ししたい
-
Pythonについて 関数の仮引数に...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
銀行の窓口処理の件で知ってる...
-
お客様から1MB未満の写真を送っ...
-
UPS警告音を止めたい
-
エクセルVBAで、MsgBox やInput...
-
Excelシート上のマクロを登録し...
-
VBAでCOPYを繰り返すと、処理が...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
おすすめ情報