C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: イベントなどの引数はDispose不要?


(過去ログ 115 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■67695 / inTopicNo.1)  イベントなどの引数はDispose不要?
  
□投稿者/ 納豆 (12回)-(2013/08/25(Sun) 00:20:40)

分類:[C#] 

こんにちわ。

Paint などのイベントで、PaintEventArgsなどが引数で来ますが、この引数はDispose不要ですか?

this.Paint += (sender, e) =>
{

    e.Dispose();
}

など。しなくても誰かがDisposeしてくれますか?

引用返信 編集キー/
■67697 / inTopicNo.2)  Re[1]: イベントなどの引数はDispose不要?
□投稿者/ tinq (5回)-(2013/08/25(Sun) 00:41:26)
イベントの場合は複数登録される場合があるのでどこかで勝手にDisposeすべきではないと思います。
他のイベントなどで使われるとObjectDisposedExceptionが発生してしまいます。
呼び出し元がDisposeしてくれるはずです。
引用返信 編集キー/
■67698 / inTopicNo.3)  Re[1]: イベントなどの引数はDispose不要?
□投稿者/ Azulean (200回)-(2013/08/25(Sun) 00:42:23)
2013/08/25(Sun) 00:44:22 編集(投稿者)

No67695 (納豆 さん) に返信
> Paint などのイベントで、PaintEventArgsなどが引数で来ますが、この引数はDispose不要ですか?

通常、コントロール側がすべてのイベントを呼び出し終わった後に Dispose しますので、イベントハンドラ側で Dispose は不要です。
逆に、他のイベントハンドラが設定されている可能性もあると考えれば、Dispose してはいけません。
(イベントには複数のイベントハンドラを割り当てられるので、一つのイベントハンドラで Dispose すると、別のイベントハンドラでは ObjectDisposedException になってしまう)

# かぶった。。。


なお、もしも自前でこういったイベントを実装する場合、以下のようにイベントの呼び出し側(提供側)が Dispose するように設計・実装した方がよいでしょう。

using (Dispose すべきオブジェクト)
{
イベント(this, Dispose すべきオブジェクトを持ったイベント引数)
}
引用返信 編集キー/
■67705 / inTopicNo.4)  Re[2]: イベントなどの引数はDispose不要?
□投稿者/ 納豆 (13回)-(2013/08/25(Sun) 21:48:43)
tinq さん Azulean さんありがとうございます。

別の話になりますが、自分でControls.Add などで追加したコントロールは、
Controls.Clear() でDisposeされるのでしょうか?



解決済み
引用返信 編集キー/
■67706 / inTopicNo.5)  Re[3]: イベントなどの引数はDispose不要?
□投稿者/ Azulean (202回)-(2013/08/25(Sun) 23:49:54)
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 されておらず、ファイナライズされていることがわかる。

解決済み
引用返信 編集キー/
■67707 / inTopicNo.6)  Re[4]: イベントなどの引数はDispose不要?
□投稿者/ 納豆 (14回)-(2013/08/26(Mon) 07:29:11)
2013/08/26(Mon) 07:30:44 編集(投稿者)

Azulean さん

提示して頂いたコードで、全てのコントロールの削除が確認でき、安心しました。
ありがとうございます。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -