class TestClass5
   {
       //EventArgs から派生したカスタム型でありイベント データを保持するために必要なフィールドまたはプロパティを提供します
       class CustomEventArgs : EventArgs
       {
           public string MyProperty { get; set; }
           public CustomEventArgs(string s)
           {
               MyProperty = s;
           }
       }

       //.NET Framework クラス ライブラリ内のすべてのイベントは次のように定義されている EventHandler デリゲートに基づいています
       //イベントを発生させるには次の2つの要素が必要です
       //
       //イベントへの応答を提供するメソッドを識別するデリゲート(この場合、pubクラスのpublic event~の部分)
       //イベントデータを保持しているクラス(class CustomEventArgs:EventArgsの部分)
       //
       //イベントハンドラーデリゲートの標準シグネチャは値を返さないメソッドを定義します(voidである)
       //このメソッドの最初のパラメーターは Object 型でイベントを発生させるインスタンスを参照します(パブリッシャー側のthis等)
       //2つ目のパラメーターは EventArgs 型から派生したイベント データを保持します
       //
       //sender はイベントを発生させるオブジェクト(パブリッシャのクラス)
       //e はデータを格納しないイベント データ オブジェクトです
       //public delegate void EventHandler(object sender, EventArgs e);    //これが基本形
       //public event EventHandler RaiseCustomEvent;                       //イベントは基本形のシグネチャをもったデリゲートの親戚だと考えると分かりやすい

       class Pub
       {
           public event EventHandler<CustomEventArgs> RaiseCustomEvent;
           //「event」は宣言元 (パブリッシャー クラス) のクラスまたは構造体内でしか呼び出せない特殊なマルチキャストデリゲートです
           //その他のクラスまたは構造体のイベントをサブスクライブすると、パブリッシャークラスがイベントを発生させるときに
           //イベント ハンドラー メソッドが呼び出されます

           public void DoSomething()
           {
               OnRaiseCustomEvent(new CustomEventArgs("Did somthing"));
           }

           protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
           {
               EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
               if (handler != null)
               {
                   e.MyProperty += string.Format(" at {0}", DateTime.Now.ToString());
                   handler(this, e);   //ここでイベントを発行している
               }
           }
       }

       class Sub
       {
           private string id;
           public Sub(string ID, Pub pub)
           {
               id = ID;
               pub.RaiseCustomEvent += HandleCustomEvent;      //ここでRaiseCustomEvent(デリゲートに似たもの)に基本形シグネチャを合わせたHandleCustomEvent関数を割り当てている
                  //ここでサブスクライブしていると考えてよい
           }

           void HandleCustomEvent(Object sender, CustomEventArgs e)
           {
               Console.WriteLine(id+ " recieved this message: {0}", e.MyProperty);
           }
       }

       //Main
       public TestClass5()
       {
           Pub pub = new Pub();
           Sub sub1 = new Sub("Sub1", pub);
           Sub sub2 = new Sub("Sub2", pub);

           pub.DoSomething();
       }
   }
最終更新:2012年06月10日 01:12