2013/08/25(Sun) 23:50:57 編集(投稿者)
■No67705 (納豆 さん) に返信
> 別の話になりますが、自分でControls.Add などで追加したコントロールは、
> Controls.Clear() でDisposeされるのでしょうか?
されません。
ガベージコレクションによって回収されたときにファイナライズはされると思いますが。
なお、自分で Add したものも Clear せずに放置しておけば、親となる Form などが Dispose されるときに、
Controls に含まれるコントロールも Dispose されますので、Clear とかは気にしなくてよいです。
こういったテストコードを書いて、デバッグメニューのウィンドウ、出力から出力ペインを出しておいてデバッグ実行すると、
Dispose が Dispose で呼ばれたか、ファイナライザで呼ばれたかを確認することができます。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Controls.Add(new TestControl());
}
private void button1_Click(object sender, EventArgs e)
{
Controls.Clear();
}
private class TestControl : Control
{
protected override void Dispose(bool disposing)
{
System.Diagnostics.Debug.WriteLine(string.Format("TestControl.Dispose {0}", disposing));
base.Dispose(disposing);
}
}
}
※Windows フォームアプリケーションプロジェクトを新規作成し、Button1 を配置し、その Button1 のクリックイベントに Button1_Click を割り当てる。
何もせずにフォームを閉じると、TestControl.Dispose True と表示され、Dispose されていることがわかる。
Button1 をクリックしてからフォームを閉じると、TestControl.Dispose False と表示され、Dispose されておらず、ファイナライズされていることがわかる。