複数のハンドラを割り当てる

C# で1個のイベントに複数のハンドラを割り当てます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. イベントに登録するハンドラの数は一個だけとは限りません。
    delegate で説明した様に、イベントに関連付けられたデリゲートに対して、複数のハンドラを登録することが出来ます。
    今回は1個のイベントに3個のハンドラを割り当ててみましょう。
  2. イベント呼び出しで実行されるハンドラ(メソッド)です。
    startHandler() と endHandler() を定義しています。
        class Class2
        {
            public void startHandler( object o, EventArgs e )
            {
                Console.WriteLine("start handler called");
            }
            public void endHandler( object o, EventArgs e )
            {
                Console.WriteLine("end handler called");
            }
        }
        
  3. event キーワードを使って、startDelegate と endDelegate にイベントで起動されるデリゲートを関連付けます。
        public event TestDelegate startDelegate;
        public event TestDelegate endDelegate;
        
  4. Class2 を生成してハンドラをイベントに関連付けられたデリゲートに登録します。
    startDelegate(event) に3個のハンドラを割り当てました。
    ハンドラの登録は「+=」で、削除は「-=」で行います。
        Class2 target1 = new Class2();
        Class2 target2 = new Class2();
        Class2 target3 = new Class2();
        public Class1()
        {
            startDelegate += new TestDelegate(target1.startHandler);
            startDelegate += new TestDelegate(target2.startHandler);
            startDelegate += new TestDelegate(target3.startHandler);
            endDelegate += new TestDelegate(target1.endHandler);
        }
        
  5. Class1 を生成して startDelegate(event) と endDelegate(event) を呼び出します。
    main.process() は二つのメソッドの境界を明確にするために "public void process() の実行" を印字しています。
        Class1 main = new Class1();
        main.startDelegate(main,EventArgs.Empty);
        main.process();
        main.endDelegate(main,EventArgs.Empty);
        
  6. このプログラムの全ソースコードです。
    Console.ReadLine(); は画面表示を確認するために追加したコードです。
    イベントの基礎は event の基礎 を参照して下さい。
    /***************************************/
    /*★ 複数のハンドラを登録    前田 稔 ★*/
    /***************************************/
    using System;
    
    namespace ConsoleApp
    {
        public delegate void TestDelegate(object sender, EventArgs e);
        class Class2
        {
            public void startHandler( object o, EventArgs e )
            {
                Console.WriteLine("start handler called");
            }
            public void endHandler( object o, EventArgs e )
            {
                Console.WriteLine("end handler called");
            }
        }
        class Class1
        {
            public event TestDelegate startDelegate;
            public event TestDelegate endDelegate;
            Class2 target1 = new Class2();
            Class2 target2 = new Class2();
            Class2 target3 = new Class2();
            public Class1()
            {
                startDelegate += new TestDelegate(target1.startHandler);
                startDelegate += new TestDelegate(target2.startHandler);
                startDelegate += new TestDelegate(target3.startHandler);
                endDelegate += new TestDelegate(target1.endHandler);
            }
            public void process()
            {
                Console.WriteLine("public void process() の実行");
            }
            static void Main()
            {
                Class1 main = new Class1();
                main.startDelegate(main,EventArgs.Empty);
                main.process();
                main.endDelegate(main,EventArgs.Empty);
                Console.ReadLine();
            }
        }
    }
    

超初心者のプログラム入門(C# Frame Work)