16

私はC#が初めてです。イベント ハンドラを複数回アタッチすると、予期しない結果が生じる可能性があるかどうかを知りたかっただけです。

実際に私のアプリケーションでは、イベントハンドラーを次のようなイベントにアタッチしています

cr.ListControlPart.Grid.CurrentCellActivated += new EventHandler(Grid_CurrentCellActivated); 

このコード行は、コード内で複数回呼び出されます。

4

3 に答える 3

29

自分で試してみてください:

static class Program
{
    static event EventHandler MyEvent;

    static void Main()
    {
        // registering event
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;

        // invoke event
        MyEvent(null, EventArgs.Empty);
        Console.ReadKey();
    }

    static void Program_MyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("MyEvent fired");
    }
}

出力:

MyEvent fired
MyEvent fired
MyEvent fired
MyEvent fired
MyEvent fired
于 2013-10-11T09:48:59.787 に答える
17

追加する前に退会することで防ぐことができますが、

Object.Event -= EventHandler(method);
Object.Event += EventHandler(method);

できる場合は、コンストラクターと言う1か所で常にイベントをサブスクライブすることで防止します

于 2013-10-11T09:50:48.860 に答える
11

イベント ハンドラーをアタッチし続けると、ハンドラーをアタッチするたびに 1 回発生します。これの意味は:

  • 一度だけ発生させる必要がある場合は、1 つのハンドラーを割り当てます。
  • 同じハンドラを 4 回アタッチすると、4 回呼び出されます。

コードを見ると、イベントに複数回フックするのではなく、一般的なイベントを 1 回CurrentCellActivatedサブスクライブする方が理にかなっています。CellActivated

于 2013-10-11T09:48:01.703 に答える