1

カスタムボタン(Winformsコントロールライブラリ)を作成していて、以下のコードを使用して、すべてのmouseenterがボタン内のすべてのコントロールに追加されるようにします。実行すると、スタックオーバーフロー例外が発生します。MouseEnterの代わりにClickを使用した同じコードがあり、正常に機能します。コードは次のとおりです。

public new event EventHandler MouseEnter {
    add
    {
        this.MouseEnter += value;
        foreach (Control i in Controls)
        {
            i.MouseEnter += value;
        }
    }
    remove
    {
        this.MouseEnter -= value;
        foreach (Control i in Controls)
        {
            i.MouseEnter -= value;
        }
    }
}

クリックコードは次のとおりです。

public new event EventHandler Click {
    add {
        this.Click += value;
        foreach (Control i in Controls) {
            i.Click += value;
        }
    }
    remove {
        this.Click -= value;
        foreach (Control i in Controls) {
            i.Click -= value;
        }
    }
}
4

3 に答える 3

5

+=「このイベントの加算器を呼び出す」の省略形です。+=あなたはあなたの加算器から呼んでいます。したがって、バインドされていない再帰が発生し、スタックオーバーフローが発生します。

コードを見ると、コントロールだけでなく、そのすべての子からもハンドラーを追加および削除するために、自分で加算器を定義しているように見えます。これはかなり悪い考えだと思います。特定のイベントのサブスクライバーは、実際のイベントが発生したときにのみ通知され、何も知らないパブリッシャーによってイベントが発生したときは通知されないという合理的な期待を持っています。

これを行うヘルパーメソッドを作成したい場合は、おそらくもっと理にかなっています。メソッドを呼び出すコンシューマーは、自分が何に取り組んでいるのかを正確に知っているからです。同様に、それは起動するための再帰バグを取り除くでしょう。

最後に、この機能はおそらく不要です。とにかく、多くのイベントが子供から親にバブルします。

于 2012-04-10T23:33:33.107 に答える
0

私はあなたがこのようなものを望んでいたと思います(私的なメンバーのための権利かどうかはわかりません):

private EventHandler mouseEnter;
public new event EventHandler MouseEnter {
add
{
    this.mouseEnter += value;
    foreach (Control i in Controls)
    {
        i.mouseEnter += value;
    }
}
remove
{
    this.mouseEnter -= value;
    foreach (Control i in Controls)
    {
        i.mouseEnter -= value;
    }
}

}

あなたはthis.MouseEnter再帰的に自分自身を呼んでいます。

于 2012-04-10T23:35:51.770 に答える
0

私はこれを置き換えることになりました。ベースをクリックします。クリックします。

    public new event EventHandler Click {
        add {
            base.Click += value;
            foreach (Control i in Controls) {
                i.Click += value;
            }
        }
        remove {
            base.Click -= value;
            foreach (Control i in Controls) {
                i.Click -= value;
            }
        }
    }
于 2012-04-11T00:16:53.717 に答える