14

次のことはいつすべきですか?

class Foo : Control
{
    protected override void OnClick(EventArgs e)
    {
        // new code here
    }
}

これに対して?

class Foo : Control
{
    public Foo()
    {
        this.Click += new EventHandler(Clicked);
    }

    private void Clicked(object sender, EventArgs e)
    {
        // code
    }
}
4

7 に答える 7

9

デリゲートをアタッチするのではなくオーバーライドすると、より効率的なコードが得られるため、通常、可能な場合は常にこれを行うことをお勧めします。詳細については、この MSDN 記事を参照してください。ここに関連する引用があります:

また、保護された OnEventName メソッドを使用すると、デリゲートをアタッチせずに、派生クラスでイベントをオーバーライドできます。派生クラスは、登録されたデリゲートがイベントを確実に受信できるように、常に基本クラスの OnEventName メソッドを呼び出す必要があります。

于 2008-10-01T19:37:05.443 に答える
8

このイベントは、外部サブスクライバー向けです。コントロールを派生させるときは、イベントをサブスクライブするのではなく、常に OnEvent メソッドをオーバーライドします。このようにして、base.OnEvent() を呼び出すと実際のイベントが発生するため、コードがいつ呼び出されるかを確認できます。これは、コードの前、コードの後、コードの途中、またはそうでないときに呼び出すことができます。全て。その後、イベントからの戻り値 (つまり、EventArgs オブジェクトの変更されたプロパティ) に反応することもできます。

于 2008-10-01T19:38:38.623 に答える
3

(少なくとも.NET 2.0では)フレームワーク(特にDataTableクラス)で、対応するFooイベントが処理されたときにのみOnFooメソッドが呼び出される場所をいくつか見つけたことに注意してください。これはフレームワークの設計ガイドラインに違反しますが、私たちはそれに固執しています。

クラスのどこかでダミーハンドラーを使用してイベントを処理することで、この問題を回避しました。例:

public class MyDataTable : DataTable
{
    public override void EndInit()
    {
        base.EndInit();
        this.TableNewRow += delegate(object sender, DataTableNewRowEventArgs e) { };
    }

    protected override void OnTableNewRow(DataTableNewRowEventArgs e)
    {
        base.OnTableNewRow(e);
        // your code here
    }
}
于 2008-10-01T22:25:57.473 に答える
1

イベントへのサブスクライブは、コントロールが別のコントロールのイベントを監視することを目的としています。独自のイベントを監視するには、OnClick で十分です。ただし、Control.OnClick はこれらのサブスクライブされたイベントの発生を処理するため、必ずオーバーライドで呼び出してください。

于 2008-10-01T19:40:00.710 に答える
0

Kent Boogaart のコメントのようにオーバーライドする場合は、base.OnClick をコールバックして、イベント サブスクリプションを呼び出せるように注意する必要があります。

于 2008-10-01T19:38:53.053 に答える
0

継承されたクラスは、それ自体のイベント、または基本クラスのイベントをサブスクライブしないでください。

クラスに別の異なるクラスのインスタンスが含まれている場合、そのクラスのイベントを消費して、独自のイベントを発生させるかどうかを決定できます。

たとえば、最近 MRU List クラスを展開しました。その中には、いくつかの ToolStripMenuItem コントロールがあり、そのクリック イベントを消費しました。そのクリック イベントが消費された後、クラスのイベントを発生させました。(そのソースコードはこちらをご覧ください

于 2008-10-01T19:39:43.003 に答える